创建指针时,我总是把这样的星号写成:
//directly adjacent to the type
int* p = new int();
所以我不会将声明与dererefence混淆。但后来我学会了这个:
//p is a pointer, q is an int
int* p, q;
这对我有误导性,所以我开始将星号放在变量旁边,而不是类型。但是,这让我思考。他们为什么这样设计呢?以这种方式思考它可能很糟糕,但我一直认为指针是该类型的一部分。就像,它不是指向int的指针,它是一个int指针。我知道它实际上不是那样的,但它总是在我的脑海中流动得更好。真正让我思考的是,为什么括号会出现:
//after the variable
int p[1];
tldr;为什么星号位于变量前面,但是后面的括号
答案 0 :(得分:5)
声明的C语法使用“向我们展示如何使用某些东西并告诉我们它是什么类型”的模型。
因此,如果x
是int
,我们会从x
开始,然后说它是int
:int x;
。
如果x
是指向int
的指针,那么我们会使用*x
来获取int
,因此我们说int *x;
。
如果x
是一个返回int
的函数,那么我们会将其用作x()
来获取int
,因此我们说这是一个{{1} }:int
。
使用此模型的一个原因是它主要使用您已经为表达式构建的语法:声明的主体以与表达式相同的方式进行解析,然后您只需处理类型。如果你不使用相同的模型,那么你必须为声明类型发明更多的语法。
此模型使int x();
等声明非常清晰:int *x, y;
和*x
都有y
类型。
答案 1 :(得分:4)
C中的int*
风格开发时间相对较晚,我无法推荐它。
是的,它在简单的情况下具有表现力。但它在多个声明或声明更复杂并涉及多层寻址操作时会迅速变得混乱。
在C中,我会坚持使用旧的约定将寻址操作应用于变量名。除其他外,实际上 表达;声明直接反映了产生类型所需的操作。也就是说,如果声明为int *foo[10]
,则表达式*foo[3]
将具有int
类型。
回答你的问题;博士...在C之前很久就用其他语言建立了变量之后的括号,没有理由改变它。之前的星号......我认为这是一个"翻转硬币"决定,答案是"出于同样的原因,一元*被用来表示"指向的价值......"一点都没他们需要操作,他们抓住的东西与其他角色的使用并没有冲突,一旦做出决定,他们就无法改变它而不会创造出新的不兼容的语言。
它是什么,因为那是什么,不满意的答案可能是。
(就个人而言,我总是想知道为什么他们没有使用@,并想知道这是否是由于近乎宗教的争论,@最正确的意思是" at"或& #34;每个"。)
答案 2 :(得分:0)
我怀疑选择[]因为索引的常用数学符号
为什么选择* x表示&x 39指向'不明显。但是把*放在' x'显然不会有效,因为*意味着相乘。
cobol会更好: - )
move what x points to to y
答案 3 :(得分:0)
有关详细信息,请参阅How do you read C declarations?。
该文章链接到cdecl实用程序(手册页位于 http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html,你需要 搜索实际的实用程序)我曾经用它来理解更复杂的东西 声明。