我对以下两个声明感到困惑:
int *p=&a; //first
和
int *p; //second
p=&a;
Asterisk *
不作为解除引用运算符。我见过的大多数地方*
都是取消引用操作符。我的问题是,除了第一种情况之外,是否有*
运算符不作为解引用运算符的情况?
答案 0 :(得分:2)
*
仅在表达式中充当取消引用运算符。
C声明的(通常很奇怪的)语法基于“声明跟随使用”的想法。所以这些声明:
int i;
int *p;
可以理解为“i
是int
”而*p
是int
。由于*p
是int
,因此p
必须是指向int
的指针。
(当然*
也是乘法运算符,如果它出现两个操作数。)
答案 1 :(得分:1)
在声明语句中,*
被认为不是解除引用运算符,而是类型说明符的一部分。 int *p
表示p is a pointer to int
,您的第一行也会将其初始化为a
的地址。第二行在正常的赋值语句中将a
的地址分配给p
。
p
仍然只是一个变量。你最好为它分配其他变量的地址,但是你可以为它分配任何你想要的东西(有些编译器会让它变得困难),然后通过解除引用它来使程序崩溃!
答案 2 :(得分:1)
虽然C标准中的正式定义不同,但*
在声明中的作用类似于解除引用运算符。 C声明背后的概念是它们显示表达式所具有的类型。例如,int *p;
基本上说“当我取消引用p
时,结果应为int
。”
所以,虽然这不是表达差异p
,但它只是说明了一个。
答案 3 :(得分:0)
&
运算符返回变量a
的内存地址,因此p
将指向变量a
的内存位置。
*
运算符称为间接或deference运算符。它返回指向的内存位置的内容。
int *p;
p被声明为指向int
的指针
p = &a;
p将指向a