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
****