类型声明 - 指针星号位置

Fey*_*yaz 33 c++ pointers

在C++中,以下表示"为int指针分配内存":

int* number;
Run Code Online (Sandbox Code Playgroud)

因此,星号是变量类型的一部分; 没有它,这意味着"为int分配内存".

那么,如果以下意思是"为两个int指针分配内存",那会不会更有意义?

int* number1, number2;
Run Code Online (Sandbox Code Playgroud)

Kat*_*ory 60

Stroustrup被问到这个,他说(释义)

  • 如果您想更多的C-十岁上下,你会说INT*一个员工*的pE (所以在你的头上,你会想"的内容一个是一个整数")
  • 如果你认为更多的C++ - 是的,你会说int*aEmployee*pE (所以在你的头脑中它是" a是一个整数指针")

你可以想想,只要你从不在同一条线上声明两个指针.

适合我.我是一个Employee* pE人,但我嫁给了一个Employee *pE人 - 我的建议是不要过于努力.


ken*_*ytm 22

实际上星号附加到变量(从C继承的约定),所以

int * number1, number2;
Run Code Online (Sandbox Code Playgroud)

声明number1为指向int(即*number1int)的指针,并number2作为指针int.

间距对number键入的方式没有影响.它只是一个令牌分隔符.以下所有内容与编译器相同,因为解析后将删除空格.

int *a;
int*a;
int* a;
int * a;
int/**a***/*/*a***/a;
Run Code Online (Sandbox Code Playgroud)

使用

int* number1, *number2;
Run Code Online (Sandbox Code Playgroud)

创建两个指针,甚至更好,将其拆分为多个声明以避免混淆.

int* number1;
int* number2;
Run Code Online (Sandbox Code Playgroud)

  • @sahs:除了"它总是这样"之外,没有什么好的理由.这不是那么合乎逻辑,而是_historical_.C,我们从中继承了这种声明语法已有40年历史,并且远远早于现在被认为是优秀语言设计的大部分内容. (12认同)

AnT*_*AnT 18

你过分简化了C++声明的结构(尽管你所提出的观点非常符合逻辑).只有在第一眼看来,C++声明似乎包含类型名称和逗号分隔的实体名称序列,但实际上在C++(以及C)中,声明实际上由类型名称和声明符序列组成.您声明的实体的完整类型信息在两个不同的位置之间分开,其中一部分实际上是其声明符的一部分.这就是它在C++中的方式.为了更好地反映声明的实际结构(如语言所示),将声明格式化为一个好主意可能是一个好主意.

int *a, *b;
Run Code Online (Sandbox Code Playgroud)

*使用实体名称显式分组,而不是使用类型名称.(但最终这是个人偏好的问题.)

至于为什么它在语言中以那种方式设计,正如你在其中一条评论中提出的那样......如你所知,描述所声明实体类型的声明语法部分可以出现在左侧名称的一侧(如*&)以及右侧(如()[])

int *f(), (&g)[5], h[2][2];
Run Code Online (Sandbox Code Playgroud)

对于出现在右侧的位,根本不可能以任何其他方式进行.他们别无选择,只能与实体名称分组,而不是与类型名称分组.有人可能会进一步询问为什么上述声明不是用C++完成的

int *() f;
int (&)[5] g;
int [2][2] h;
Run Code Online (Sandbox Code Playgroud)

(即,所有与类型相关的内容都出现在紧凑组的左侧)......好吧,这个问题的答案就是它在C++中的方式.该方法继承自C,并且"声明必须类似于使用"通常被引用作为基本原理.

PS要记住的另一件事(以及经常被错误解释的)是声明中与类型名称相邻的限定符是公共类型的一部分,而不是第一个单独声明符的一部分.例如

int const *a, *b;
Run Code Online (Sandbox Code Playgroud)

声明const int *a并且const int *b,不是int *b因为有些人可能mistakingly相信.出于这个原因,我个人更喜欢使用更合乎逻辑的

const int *a, *b;
Run Code Online (Sandbox Code Playgroud)

订购(即使同时我更喜欢*用名称分组,而不是类型).


sbi*_*sbi 8

这只是C声明语法的许多不规则之一.类型修饰符*是类型的一部分,但在语法上它属于声明的标识符.
对于&[]BTW来说也是如此.

请参阅此处了解*除了修改类型之外的内容.

  • @Peaker:我在19​​92年左右学会了不喜欢C的声明语法.20年前,我第一次赚钱写C++代码(使用C的声明语法).然而,通过习惯和经常使用二十多年的事实,我可以立即理解(大部分)它,并且我喜欢C++不会阻止我将声明语法识别为完全失败,这只能是原谅以其巨大的古代.你也应该学会区分不断暴露的习惯和立即被认识到的好处.继续学习! (2认同)