-1

我对以下两个声明感到困惑:

int *p=&a; //first

int *p; //second
p=&a;

Asterisk*不充当解引用运算符。我见过的大多数地方都*充当解引用运算符。我的问题是,除了第一种情况外,是否存在*运算符不充当取消引用运算符的情况?

4

4 回答 4

2

*仅在表达式中充当解引用运算符。

C 声明的(诚然奇怪的)语法是基于“声明遵循使用”的思想。所以这些声明:

int i;
int *p;

可以读作“i是一个int”并且*p是一个int。既然*p是一个int,那么p一定是一个指向-的指针int

(当然*,如果它与两个操作数一起出现,它也是乘法运算符。)

于 2013-08-29T19:09:44.777 回答
1

尽管 C 标准中的正式定义不同,*但在声明中确实起到了取消引用运算符的作用。C 声明背后的概念是它们显示表达式将具有的类型。例如,int *p;基本上说“当我取消引用p时,结果应该是一个int。”</p>

所以,虽然这不是一种尊重的表达p,但它是一种说明。

于 2013-08-29T19:58:35.157 回答
1

在声明语句*中被认为不是解引用运算符,而是类型说明符的一部分。int *p意味着p is a pointer to int,并且您的第一行还将其初始化为a. 第二行在普通赋值语句中分配ato的地址。p

p仍然只是一个变量持有的东西。最好将其他变量的地址分配给它,但是您可以为它分配任何您想要的东西(尽管有些编译器会使其变得困难),然后通过取消引用它来使您的程序崩溃!

于 2013-08-29T19:14:03.690 回答
0

&运算符返回变量的内存地址a,从而p指向变量的内存位置a

*运算符称为间接顺从运算符。它返回指向的内存位置的内容。

int *p; p 被声明为指向int
p = &a; p 的指针将指向的地址a

于 2013-08-29T19:15:14.000 回答