与解引用运算符混淆

时间:2011-11-17 03:59:31

标签: c++

为了清楚事实,我想问一下

int i = 1;
int *p = &i;
i = *p;

你在p上叫做运营商*?被称为解除引用运算符与第3行相同?

5 个答案:

答案 0 :(得分:6)

这是指针声明的一个例子:

int *p = &i;

这是解除引用运算符的示例:

i = *p;

运算符仅适用于变量,而不适用于类型,它们不是同一个东西。

答案 1 :(得分:4)

在这种情况下,

*不是运算符,它是声明符。应用于类型时,它会将其转换为指向该类型的指针。

您可以将int*视为一种类型。

用这种方式写它会更清楚:

int i = 1;
int* p = &i;
i = *p;

答案 2 :(得分:2)

int i = 1;
int *p = &i;

*是声明语法的一部分。 int *p表示p的类型为int*

i = *p;

*是解除引用运算符。

但两者使用相同语法的事实并非巧合。 C(看似奇怪的)声明语法主要基于“声明遵循使用”的原则。

阅读声明的一种方法

int *p;

是声明*p的类型为int。由此得出p属于int*类型。类似地:

int *a, b, c[20];

表示*abc[blah]都是int类型,因此a的类型为int*b为类型为intc属于int[20]类型。 (请注意,声明和用法之间的对应关系并不完美; c[20]刚好超过数组的末尾,并且实际上并不存在。)

这就是为什么(至少在一个思想流派中)指针声明中的*位于标识符旁边,而不是类型。

答案 3 :(得分:1)

这是指针声明,而不是取消引用运算符。

来自cplusplus.com tutorial

  

我想强调一下我们使用时的星号(*)   声明一个指针只意味着它是一个指针(它是它的一部分   类型化合物说明符),不应与之混淆   我们之前看过的解引用运算符,但是   也用星号(*)写。他们只是两个不同   用相同符号表示的东西。

答案 4 :(得分:0)

以这种方式定义指针

int *p = &i;

有些令人困惑。我建议你使用它(注意空格)

int* p = &i;

但是以这种方式定义多个指针时会出现问题:

int* p = &i, * q = NULL;

更清楚的是,首先定义指针类型,然后使用该类型定义变量:

typedef int* int_ptr;
int_ptr p = &i, q = NULL;