* p和p *之间有什么区别?

时间:2011-02-12 07:29:37

标签: c pointers

p*使用指针的另一种方法吗?

指针变量*p是否与p*不同?

4 个答案:

答案 0 :(得分:9)

*p取消引用指针,p*将指针乘以某事。

答案 1 :(得分:8)

语法

*ptr

意味着取消引用指针以获取它指向的对象。

语法

ptr*

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

*ptr*137;

表示“取消引用ptr,然后将它指向的值乘以137.”。但是,在这种情况之外,在指针变量之后放置一个星是非法的。

现在,合法的是在一个类型之后放置一个明星,如

int*

其中描述的类型是指向星形左侧类型的指针。有趣的是,这意味着您不能在类型(不合法)之前放置星形,也不能在指针之后放置星形(因为取消引用运算符向左移动)。原因部分是由于在C中,类型应该模仿它们的工作方式。也就是说,如果你有

int *p;

然后语法是一个视觉提示,要获得p指向的整数,你应该在它前面放一个星号。

答案 2 :(得分:3)

前缀vs二进制vs类型表达式

*是指针的前缀一元运算符和用于乘法的中缀一元运算符。有一种特殊情况,只需要纯类型就可以看到sizeof(int *)void f(int *, char *)之类的东西,但它仍然是未命名标识符的前缀*

备用Universe中的后缀解除引用

有趣的是,* 可能是后缀一元运算符,在这种情况下,语言中的一些内容可能会稍微好一些。例如,->运算符不是必需的:

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