【发布时间】:2010-04-24 10:56:33
【问题描述】:
在 C++ 中,以下表示“为 int 指针分配内存”:
int* number;
所以,星号是变量类型的一部分;没有它,这将意味着“为 int 分配内存”。
那么,如果下面的意思是“为两个 int 指针分配内存”不是更有意义吗?
int* number1, number2;
【问题讨论】:
-
Stroustrup's answer 同样的问题。
在 C++ 中,以下表示“为 int 指针分配内存”:
int* number;
所以,星号是变量类型的一部分;没有它,这将意味着“为 int 分配内存”。
那么,如果下面的意思是“为两个 int 指针分配内存”不是更有意义吗?
int* number1, number2;
【问题讨论】:
Stroustrup 被问到这个,他说(释义)
- 如果你认为更多的是 C-ish,你会说 int *a 和 Employee *pE (所以在你的脑海里你在想“a 的内容是一个整数”)
- 如果你认为更多的是 C++-ish,你会说 int* a 和 Employee* pE (所以在你的脑海中它是“a 是一个整数指针”)
你可以随心所欲,只要你从不声明两个 指针在同一行。
为我工作。我是 Employee* pE 类型的人,但我嫁给了 Employee *pE 类型的人 - 我的建议是不要为此过于激动。
【讨论】:
实际上星号是附加在变量上的(继承自 C 的约定),所以
int * number1, number2;
将number1 声明为指向int 的指针(即*number1 是int),并将number2 声明为int。
间距对number 的键入方式没有影响。它只是用作标记分隔符。以下所有对编译器都是一样的,因为解析后空格会被剥离。
int *a;
int*a;
int* a;
int * a;
int/**a***/*/*a***/a;
使用
int* number1, *number2;
创建两个指针,或者更好的是,将其拆分为多个声明以避免混淆。
int* number1;
int* number2;
【讨论】:
您过度简化了 C++ 声明的结构(即使您提出的观点完全合乎逻辑)。乍一看,C++ 声明似乎由类型名称和逗号分隔的实体名称序列组成,但实际上在 C++(以及 C)中,声明实际上由类型名称和 声明符。您声明的实体的完整类型信息在 两个 单独的位置之间拆分,其中一部分实际上是其声明符的一部分。这就是它在 C++ 中的方式。为了更好地反映声明的实际结构(如语言所见),最好将声明格式化为
int *a, *b;
即将*s 与实体名称明确分组,而不是与类型名称。 (但归根结底是个人喜好问题。)
至于为什么在语言中以这种方式设计,正如您在其中一个 cmets 中所问的那样......如您所知,描述被声明实体类型的声明语法部分可以出现在名称的左侧(如* 和&)以及其右侧(如() 和[]),如
int *f(), (&g)[5], h[2][2];
对于出现在右侧的位,根本不可能以任何其他方式进行。他们别无选择,只能与实体名称而不是类型名称进行分组。有人可能会进一步问,为什么上述声明没有在 C++ 中完成
int *() f;
int (&)[5] g;
int [2][2] h;
(即所有与类型相关的东西都出现在紧凑组的左侧)...嗯,这个问题的答案就是它在 C++ 中的方式。该方法继承自 C,因此“声明必须类似于使用”经常被引用为基本原理。
附:另一件需要记住的事情(并且经常被错误地解释)是声明中与类型名称相邻的限定符是通用 type 的一部分,而不是第一个单独声明符的一部分。例如
int const *a, *b;
声明 const int *a 和 const int *b,而不是 int *b,因为有些人可能会误认为。出于这个原因,我个人更喜欢使用更合乎逻辑的
const int *a, *b;
排序(尽管同时我更喜欢将 * 与名称分组,而不是与类型)。
【讨论】:
*、&、() 和[] 与他们描述的关于那个变量的名称组合起来似乎更合乎逻辑,尽管他们修改了它类型,但不是同一行中所有其他变量的类型;同样,限定符与该行中声明的所有变量相关联,因此 commong 因此在它们前面加上 type 似乎是正确的。我一直在做这件事时没有考虑其基本原理,现在我知道了,所以我会继续坚持下去,即使有人认为我是伪装成 C++ 程序员的 C 程序员。
这只是 C 声明语法的许多不规则之处之一。类型修饰符 * 是类型的一部分,但在语法上它属于声明的标识符。& 和 [] 也是如此,顺便说一句。
请参阅 here 了解 * 除了修改类型之外的作用。
【讨论】:
<type> <name>。这不是 C 声明语法的工作原理,如果您认为您会反复感到困惑并发现违规行为。
不,
int* number1, number2;
将number1 声明为指向int 的指针,将number2 声明为int。就个人而言,我也更喜欢将星号附加到类型上,这正是你在这个问题中提出的问题,所以我将声明两个指针如下:
int* number1;
int* number2;
【讨论】: