关于*运算符性质的困惑

时间:2013-08-29 19:06:54

标签: c dereference

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

int *p=&a; //first

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

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

4 个答案:

答案 0 :(得分:2)

*仅在表达式中充当取消引用运算符

C声明的(通常很奇怪的)语法基于“声明跟随使用”的想法。所以这些声明:

int i;
int *p;

可以理解为“iint”而*pint。由于*pint,因此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

的地址