在C++中,以下代码表示“为int指针分配内存”:
int* number;
所以,星号是变量类型的一部分;如果没有它,那就意味着“为int分配内存”。那么,如果下面这个意思是“为两个int指针分配内存”,那不是更有意义吗?
int* number1, number2;
在C++中,以下代码表示“为int指针分配内存”:
int* number;
所以,星号是变量类型的一部分;如果没有它,那就意味着“为int分配内存”。int* number1, number2;
当被问及这个问题时,Stroustrup说(类似于以下内容)
- 如果你更倾向于C语言风格,你会写int *a和Employee *pE (因此在你的脑海中,你会认为"a的内容是一个整数")
- 如果你更倾向于C++语言风格,你会写int* a和Employee* pE (因此在你的脑海中,你会认为"a是一个整数指针")
你可以按照自己的喜好思考,只要不要在同一行声明两个指针。
对我而言,这个问题没什么。我是那种用Employee* pE
的人,但我配偶是那种用Employee *pE
的人。我的建议是不要太过于纠结。
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;
即明确将*
与实体名称分组,而不是类型名称。(但是最终这是个人偏好的问题。)
至于为什么语言是这样设计的,正如您在其中一个评论中提问的那样...正如您所知,声明语法的部分描述正在声明的实体的类型可以出现在名称的左侧(例如*
和&
)以及其右侧(例如()
和[]
),如下所示
int *f(), (&g)[5], h[2][2];
对于出现在右侧的位,没有其他的选择。它们必须与实体名称分组,而不是类型名称。可能会进一步问为什么上述声明不是用C++完成的。
int *() f;
int (&)[5] g;
int [2][2] h;
也就是说,所有与类型相关的内容都会以紧凑的组合形式出现在左侧。... 好吧,对于这个问题的答案就是C++采用了这种方式。这种方法是从C语言继承而来的,在那里,“声明必须类似于使用”通常被引用为其理由。
另外需要记住的一件事(并且经常被错误地解释)是,限定符与类型名相邻的声明属于公共类型,而不是第一个单独的声明符的一部分。例如:
int const *a, *b;
声明了const int *a
和const int *b
,而不是一些人错误地认为的int *b
。因此,我个人更喜欢使用更合乎逻辑的
const int *a, *b;
尽管我更喜欢将*
与名称一起分组而不是与类型一起排序,但仍需要排序。
*
、&
、()
和 []
与变量名分组,因为它们描述了 该 变量,尽管它们修改了其类型,但并不影响同一行中所有其他变量的类型;同样,限定符与在该行中声明的所有变量相关联,因此在类型之前加上它们似乎是正确的。我一直在不考虑原理的情况下这样做,现在我知道了,所以我会继续坚持这种做法,即使有人认为我是一个伪装成 C++ 程序员的 C 程序员。 - legends2k<type> <name>
。这不是C声明语法的工作方式,如果你认为是这样的话,你会反复感到困惑并发现不规则性。 - Peakerint* number1, number2;
声明number1
为指向int
的指针,将number2
声明为int
类型。个人而言,我更喜欢将星号附加到类型上,这在您提问中所涉及的问题中也存在一些小陷阱,因此我将按照以下方式声明两个指针:
int* number1;
int* number2;