在创建指针时,我总是把这样的星号写成:
//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; 为什么星号位于变量前面,但后面是括号
声明的C语法使用"向我们展示如何使用某些东西并告诉我们它是什么类型"的模型.
因此,如果x是int,我们开始,x然后说它是int:int x;.
如果x是一个指向a的指针int,那么我们就会*x得到一个int,所以我们说int *x;.
如果x是一个返回a的函数int,那么我们会用它x()来得到一个int,所以我们说这是一个int:int x();.
使用此模型的一个原因是它主要使用您已经为表达式构建的语法:声明的主体以与表达式相同的方式进行解析,然后您只需处理类型.如果您不使用相同的模型,那么您必须为声明类型创建更多语法.
通过这个模型,声明如int *x, y;非常清楚:无论*x和y有型int.