是p*
使用指针的另一种方法吗?
指针变量*p
是否与p*
不同?
答案 0 :(得分:9)
*p
取消引用指针,p*
将指针乘以某事。
答案 1 :(得分:8)
语法
*ptr
意味着取消引用指针以获取它指向的对象。
语法
ptr*
在C中没有意义,除非它是乘法的开始。例如:
*ptr*137;
表示“取消引用ptr,然后将它指向的值乘以137.”。但是,在这种情况之外,在指针变量之后放置一个星是非法的。
现在,合法的是在一个类型之后放置一个明星,如
int*
其中描述的类型是指向星形左侧类型的指针。有趣的是,这意味着您不能在类型(不合法)之前放置星形,也不能在指针之后放置星形(因为取消引用运算符向左移动)。原因部分是由于在C中,类型应该模仿它们的工作方式。也就是说,如果你有
int *p;
然后语法是一个视觉提示,要获得p指向的整数,你应该在它前面放一个星号。
答案 2 :(得分:3)
*是指针的前缀一元运算符和用于乘法的中缀一元运算符。有一种特殊情况,只需要纯类型就可以看到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似乎在一篇论文中陈述 1 ,他早就转向了后缀解除引用,但C已经过于成熟。表达式语法在任何一种方式都是合理可行的,但它也可以解开C语句的语法,并且删除了大多数需要以内向外的方式读取它们,以至于人们一直遇到麻烦:
int *fp();
int fp()*; // alternate universe
int (*pf)();
int pf*(); // alternate universe
int *(*pfp)();
int pfp*()*; // alternate universe
1。 See The Development of the C Language.,Dennis M. Ritchie 功能
答案 3 :(得分:2)
我猜你已经知道这是一个乘法运算:
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;
在这种情况下,我们为名为'p'的'int'类型创建了另一个名称(同义词)。所以这里当我们说'p'时,它被编译器翻译成'int'。这样我们也可以说'p *'。