可能重复:
In C, why is the asterisk before the variable name, rather than after the type?
Declaring pointers; asterisk on the left or right of the space between the type and name?
我一直在使用指针一段时间,并用于声明像
这样的指针int *x;
但是通过一些代码注意到,在某些情况下*似乎是在数据类型之后,比如
void* setValue(){
/* */
}
有什么区别以及为什么这样使用
答案 0 :(得分:12)
语义上没什么。这是风格。
将星形放在变量旁边的优点是防止了这个常见错误:
char* str1, str2;
/* str2 is a char, not char* ! */
char *str1, *str2;
/* ok */
此问题与返回类型不存在,所以更重要的是那里。
答案 1 :(得分:2)
没有区别,在某些情况下,最好将它保持在正确的位置:
int* p1,p2;
看起来像p1和p2 ara指针,而只有p1是,
int *p1,p2;
现在它看起来好一点,但好的风格是将它拆分为单独的行:
int *p1;
int p2;
答案 2 :(得分:2)
它与a+b
和a + b
之间的差异完全相同 - 也就是说,没有区别。空格毫无意义,除非需要分隔标记。
答案 3 :(得分:1)
没有语义差异。
通常建议您将*
放在该类型的旁边,因为x
的实际类型为void *
。然而,这在语法上是错误的,因为C / C ++将星形绑定到变量名称。
int *x, y; // declare one pointer to int x and one int y
我个人试着让*
保持在中间
int * x;
答案 4 :(得分:0)
指向void
的指针,标记为void*
是一个通用的不透明指针。你可以传递它(作为参数,结果,通过变量,字段......)并比较它,但获取指向数据的唯一方法是适当地转换它。不合适的演员表是未定义的行为,可能会导致程序崩溃。
对于*
表示类型中的指针之前或之后的空间,它是一种风格的东西。空格并不重要,除了标记分隔符(*
本身就是一个标记)。
我强烈建议与间距保持一致。你可以使用像indent
缩进您的源代码(并将-T
选项传递给它有助于良好缩进类型名称)。 GNU indent
工具正在规范空间,并有许多选项来调整其行为(您可以将它们放在.indent.pro
文件中)。对于C ++代码,请考虑使用astyle
而不是indent
。