在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*a和Employee*pE (所以在你的头脑中它是" a是一个整数指针")
你可以想想,只要你从不在同一条线上声明两个指针.
适合我.我是一个Employee* pE
人,但我嫁给了一个Employee *pE
人 - 我的建议是不要过于努力.
ken*_*ytm 22
实际上星号附加到变量(从C继承的约定),所以
int * number1, number2;
Run Code Online (Sandbox Code Playgroud)
声明number1
为指向int
(即*number1
是int
)的指针,并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)
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)
订购(即使同时我更喜欢*
用名称分组,而不是类型).