C++为什么被设计成这样,使得在同一行声明两个int *的正确方式是:
int *x, *y;
不
int* x,y;
我知道一些人认为你应该避免使用这两种形式并且每个变量都要在自己的行上声明,但我对为什么做出这个语言决定感兴趣。
C++为什么被设计成这样,使得在同一行声明两个int *的正确方式是:
int *x, *y;
不
int* x,y;
我知道一些人认为你应该避免使用这两种形式并且每个变量都要在自己的行上声明,但我对为什么做出这个语言决定感兴趣。
int * p
,因为我觉得两种方式都不太好看 :) - nikolasint
和p
的积”! - leftaroundaboutint *p;
当你声明表达式*p
的类型为int
时(编译器相应地计算出p
的实际类型)。
当然,在C引入typedef
和后来的struct
之后,这个说法已经不再成立了。随着const
的引入(先是在C++中引入,然后再次加入C语言),任何类似于以下的东西都彻底消失了。
int *const p;
答案
这来自于“C语言”(“纯C”,“原生C”等)。
当一个指针变量已经声明时,它的使用方式如下:
...
*p = &x;
*q = SomePointerFunc();
....
我读到过,“C”语言的原始发明者希望程序员使用与指针变量相同的语法来声明指针变量,在变量标识符之前加上星号:
...
int *p;
int *q;
...
...
x[5] = 'a';
y[77] = SomeItemFunc();
...
...
char x[5];
int y[100];
...
我曾经遇到的一些老师坚持要这样声明变量和函数类型(星号靠近标识符):
...
int *p;
int *q;
...
不要使用这个(类型标识符旁边的星号):
...
int* p;
int* q;
...
额外内容
在Java和其他语言中,如C#,数组或指针的声明与类型紧挨着,变量或函数标识符单独出现,就像这个伪代码一样:
*int p;
*int q;
char[5] x;
int[100] y;
我更喜欢这种技术。
干杯。
int* p = new int[5];
然后int* a = &p;
就没问题了:“将指针a赋值为p的地址”。但是int *b = &p;
就很奇怪了:“将整数*b赋值为p的地址”。考虑到 *b 是一个整数,为什么要给地址呢?这就是为什么我认为指针的链式声明毫无意义的原因。 - Morwenn