您能告诉我int* p
和int *p
声明之间的区别吗?
答案 0 :(得分:34)
没有区别。
这是符号的问题,而不是语义。第二个是误导性,因为
int *a, b;
明确声明int*
和int
,而
int* a, b;
看起来好像是在宣布两个指针,当它真的像上面那样做。
答案 1 :(得分:17)
这是一个很好的问题。
int* p
int* p, q
错误地暗示p
和q
都是指针(导致优先在两行上声明这一点,这也提高了分配时的可读性,并使其更容易快速剪切/粘贴或评论特定的行/变量)int* p
直观地将类型与标识符*p
然后明确指出取消引用(假设您在二进制operator*
ala 2 * 3
周围放置空格)...&x
显然是在使用地址,...& x
必须声明引用变量,... & ...
是按位AND运算符 int *p
int *p, q
清楚地反映p
是指针而q
没有。int *p
在视觉上将类型与标识符类似于出现在函数声明中的类型......
int* f(), g(); // declares int g();
int *h(), (*i)(); // i is pointer to function returning int
int *const*m(), n(); // m returns pointer to (const-pointer to int)
// n returns int
...但至少函数参数不能如此毛茸茸 - 类型规范在每个逗号分隔符后重新开始。
总之,如果您的编码样式/代码库在单行源代码上使用多个声明,int *p
会更好,否则int* p
会提供更清晰的类型分隔和以下标识符的
尽管如此,人们的偏好主要取决于他们习惯的东西。
答案 2 :(得分:3)
声明单个指针时,这两个声明是等效的。有关详细信息,请参阅link
答案 3 :(得分:0)
这两个声明是完全一样的!
答案 4 :(得分:0)
它们是相同的。第一个将p
视为int *
类型,第二个将*p
视为int
。
第二个告诉您C声明如何工作:声明使用方式。
Internet充斥着复杂的方法来解析诸如“顺时针/螺旋规则”和“正确规则”之类的声明。人们使简单的一种复杂化:为什么我们需要大声朗读这些类型?我们只需要知道如何使用它!
顺便说一句,第一个有时候会让你生气。考虑一下:
int* p, q;
您希望p
和q
都变成int *
,但不幸的是没有。
如果您写int *p, *q
,事情会更简单。
无论如何,如果您坚持采用一种方法,都可以尝试一下。
typedef int* intp;
intp p, q;