与取消引用运算符混淆

Confusion with dereference operator

本文关键字:运算符 引用 取消      更新时间:2023-10-16

为了清楚事实,我想问

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

你怎么称呼p上的接线员?是否被称为与第3行中相同的取消引用运算符?

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

int *p = &i;

这是一个去引用操作符的例子:

i = *p;

运算符只适用于变量,不适用于类型,它们不是一回事。

*在本例中不是运算符,而是声明符。当应用于某个类型时,它会将其转换为指向该类型的指针。

你可以把int*看作一种类型。

这样写会更清楚:

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

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

i = *p;

*是一个解引用运算符。

但两者使用相同语法并非巧合。C(看似怪异(的声明语法主要基于"声明遵循用法"的原则。

阅读声明的一种方法

int *p;

它声明CCD_ 8是CCD_。由此可知,CCD_ 10属于CCD_。类似:

int *a, b, c[20];

表示*abc[blah]都是int类型,因此aint*类型,bint类型,而cint[20]类型。(请注意,声明和用法之间的对应关系并不完美;c[20]刚刚过了数组的末尾,实际上并不存在。(

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

这是一个指针声明,而不是一个解引用运算符。

来自cplusplus.com教程:

我想强调的是,我们在声明指针只意味着它是指针(它是类型复合说明符(,不应与我们前面看到的解引用运算符也用星号(*(书写。他们只是两个不同用相同符号表示的事物。

以这种方式定义指针

int *p = &i;

在某种程度上令人困惑。我建议你用这个(注意空格(

int* p = &i;

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

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

因此,更清楚地说,首先定义指针类型,并使用该类型来定义变量:

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