C p和p的区别是什么?

C p和p的区别是什么?,c,pointers,C,Pointers,p*是使用指针的另一种方式吗 是一个指针变量,不同于p*?*p是对指针的解引用,p*是指针乘以某个值。语法 *ptr ptr* 表示取消对指针的引用以获取指针指向的对象 语法 *ptr ptr* 在C中没有意义,除非它是乘法的开始。例如: *ptr*137; 表示“解除对ptr的引用,然后将其指向的值乘以137。”。但是,在这种情况下,在指针变量后加星号是非法的 现在,合法的做法是在类型后面加上一个星号,如 int* 它描述了一个类型,它是指向星号左边类型的指针。有趣的是,这意味着您

p*
是使用指针的另一种方式吗


是一个指针变量,不同于
p*

*p
是对指针的解引用,
p*
是指针乘以某个值。

语法

*ptr
ptr*
表示取消对指针的引用以获取指针指向的对象

语法

*ptr
ptr*
在C中没有意义,除非它是乘法的开始。例如:

*ptr*137;
表示“解除对ptr的引用,然后将其指向的值乘以137。”。但是,在这种情况下,在指针变量后加星号是非法的

现在,合法的做法是在类型后面加上一个星号,如

int*
它描述了一个类型,它是指向星号左边类型的指针。有趣的是,这意味着您不能将星号放在类型之前(这是不合法的),也不能将星号放在指针之后(因为取消引用操作符位于左侧)。部分原因是因为在C语言中,类型应该模仿它们的工作方式。也就是说,如果你有

int *p;

那么语法就是一个视觉提示,要得到p所指的整数,你应该在它前面加一个星号。

我想你已经知道这是一个乘法运算了:

p * 3;
另一种情况是:

从“p”指向的位置检索值:

int i = 1;
int *p;       // Declare p as an int * (pointer to an int)
p = &i;       // Set the address p points to

printf("The value of p is %d\n", *p);  // fetch value from p
还有一个例子,你可以看到p*

typedef int p;

p *aPtr = &i;
在本例中,我们为类型“int”创建了另一个名为“p”的名称(同义词)。所以在这里,当我们说“p”时,编译器会将它翻译成“int”。这样我们也可以说“p*”。

前缀vs二进制vs类型表达式 *是指针的前缀一元运算符和乘法的中缀一元运算符。有一种特殊情况,即只需要一个纯类型,因此可以看到类似于
sizeof(int*)
,或
void f(int*,char*)
,但它仍然是未命名标识符上的前缀
*

交替宇宙中的后缀解引用 有趣的是,
*
可能是一个后缀一元运算符,在这种情况下,语言中的一些事情可能会稍微好一些。首先,
->
操作符是不必要的:

p->field
p*.field // like Pascal's p^.field
即使在今天,您也可以使用:

p[0].field
还有

(*x)->y // today
x**.y   // alternate universe

*x->y   // today
x*.y*   // alternate universe
DMR在一篇论文中似乎指出,他本来会很早就转向后缀解引用,但C已经太成熟了。无论采用哪种方式,表达式语法都是合理可行的,但它也会解开C声明语法的纠缠,并消除大多数需要从内到外阅读它们的情况,而人们通常会遇到以下问题:

int *fp();
int fp()*;    // alternate universe

int (*pf)();
int pf*();    // alternate universe

int *(*pfp)();
int pfp*()*;  // alternate universe

一,,丹尼斯·里奇

o_uuuuo
****