放置[]和*

BWG*_*BWG 3 c pointers

在创建指针时,我总是把这样的星号写成:

//directly adjacent to the type
int* p = new int();
Run Code Online (Sandbox Code Playgroud)

因此,我不会将声明与dererefence混淆.但后来我学到了这个:

//p is a pointer, q is an int
int* p, q;
Run Code Online (Sandbox Code Playgroud)

这对我有误导性,所以我开始把星号放在变量旁边,而不是类型.但是,这让我思考.他们为什么这样设计呢?以这种方式思考它可能很糟糕,但我一直认为指针是该类型的一部分.就像,它不是指向int的指针,它是一个int指针.我知道它实际上不是那样的,但它总是在我的脑海中流动得更好.真正让我思考的是,为什么括号走了:

//after the variable
int p[1];
Run Code Online (Sandbox Code Playgroud)

tldr; 为什么星号位于变量前面,但后面是括号

Eri*_*hil 5

声明的C语法使用"向我们展示如何使用某些东西并告诉我们它是什么类型"的模型.

因此,如果xint,我们开始,x然后说它是int:int x;.

如果x是一个指向a的指针int,那么我们就会*x得到一个int,所以我们说int *x;.

如果x是一个返回a的函数int,那么我们会用它x()来得到一个int,所以我们说这是一个int:int x();.

使用此模型的一个原因是它主要使用您已经为表达式构建的语法:声明的主体以与表达式相同的方式进行解析,然后您只需处理类型.如果您不使用相同的模型,那么您必须为声明类型创建更多语法.

通过这个模型,声明如int *x, y;非常清楚:无论*xy有型int.