我对以下两个声明感到困惑:
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
. 第二行在普通赋值语句中分配a
to的地址。p
p
仍然只是一个变量持有的东西。最好将其他变量的地址分配给它,但是您可以为它分配任何您想要的东西(尽管有些编译器会使其变得困难),然后通过取消引用它来使您的程序崩溃!
&
运算符返回变量的内存地址a
,从而p
指向变量的内存位置a
。
该*
运算符称为间接或顺从运算符。它返回指向的内存位置的内容。
int *p;
p 被声明为指向int
p = &a;
p 的指针将指向的地址a