我对以下两个声明感到困惑:
int *p=&a; //first
和
int *p; //second
p=&a;
Asterisk*不充当解引用运算符。我见过的大多数地方都*充当解引用运算符。我的问题是,除了第一种情况外,是否存在*运算符不充当取消引用运算符的情况?
我对以下两个声明感到困惑:
int *p=&a; //first
和
int *p; //second
p=&a;
Asterisk*不充当解引用运算符。我见过的大多数地方都*充当解引用运算符。我的问题是,除了第一种情况外,是否存在*运算符不充当取消引用运算符的情况?
*仅在表达式中充当解引用运算符。
C 声明的(诚然奇怪的)语法是基于“声明遵循使用”的思想。所以这些声明:
int i;
int *p;
可以读作“i是一个int”并且*p是一个int。既然*p是一个int,那么p一定是一个指向-的指针int。
(当然*,如果它与两个操作数一起出现,它也是乘法运算符。)
尽管 C 标准中的正式定义不同,*但在声明中确实起到了取消引用运算符的作用。C 声明背后的概念是它们显示表达式将具有的类型。例如,int *p;基本上说“当我取消引用p时,结果应该是一个int。”</p>
所以,虽然这不是一种尊重的表达p,但它是一种说明。
在声明语句*中被认为不是解引用运算符,而是类型说明符的一部分。int *p意味着p is a pointer to int,并且您的第一行还将其初始化为a. 第二行在普通赋值语句中分配ato的地址。p
p仍然只是一个变量持有的东西。最好将其他变量的地址分配给它,但是您可以为它分配任何您想要的东西(尽管有些编译器会使其变得困难),然后通过取消引用它来使您的程序崩溃!
&运算符返回变量的内存地址a,从而p指向变量的内存位置a。
该*运算符称为间接或顺从运算符。它返回指向的内存位置的内容。
int *p; p 被声明为指向int
p = &a; p 的指针将指向的地址a