在C / C ++中声明指针变量的正确方法

时间:2011-08-09 02:14:14

标签: c++ c pointers coding-style

我注意到有些人使用以下表示法来声明指针变量。

(a) char* p;

而不是

(b) char *p;

我用(b)。符号(a)背后的理性是什么? 符号(b)对我来说更有意义,因为字符指针本身不是一种类型。相反,类型是字符,变量可以是指向字符的指针。

char* c;

这看起来有一个char *类型,变量c属于那种类型。但实际上类型是char和* c(c指向的内存位置)是该类型(char)。如果你一次声明多个变量,这种区别就变得很明显了。

char* c, *d;

这看起来很奇怪。 c和d都是指向字符的同一种指针。因为下一个看起来更自然。

char *c, *d;

感谢。

5 个答案:

答案 0 :(得分:91)

Bjarne Stroustrup说:

  

“int * p;”之间的选择和“int * p;”不是对与错,而是关于风格和重点。 C强调表达;声明通常被认为只是一种必要的邪恶。另一方面,C ++非常重视类型。

     

“典型的C程序员”写“int * p;”并解释它“* p是什么是int”强调语法,并可能指向C(和C ++)声明语法来争论样式的正确性。实际上,*与语法中的名称p绑定。

     

“典型的C ++程序员”写“int * p;”并解释它“p是指向int的指针”强调类型。实际上,p的类型是int *。我显然更喜欢这种强调,并认为它对于使用C ++的更高级部分非常重要。

来源:http://www.stroustrup.com/bs_faq2.html#whitespace

我建议使用后一种风格,因为在你在一行中声明多个指针的情况下(你的第四个例子),带有变量的星号将是你习惯的。

答案 1 :(得分:45)

我个人更喜欢将*与其他类型

放在一起
char* p;  // p is a pointer to a char.

人们会争辩“然后char* p, q;会变得误导”,我说,“所以不要这样做。”

答案 2 :(得分:29)

如何写作没有区别。但是如果你想在一行中声明两个或更多指针更好地使用(b)变体,因为它很清楚你想要什么。看下面:

int *a;
int* b;      // All is OK. `a` is pointer to int ant `b` is pointer to int
char *c, *d; // We declare two pointers to char. And we clearly see it.
char* e, f;  // We declare pointer `e` and variable `f` of char type.
             // Maybe here it is mistake, maybe not. 
// Better way of course is use typedef:
typedef char* PCHAR;
PCHAR g, h;  // Now `g` and `h` both are pointers.
// If we used define construction for PCHAR we'd get into problem too.

答案 3 :(得分:9)

妥协是

char * p;

K& R使用

char *p;

除非您遵循编码标准,否则由您决定 - 在这种情况下,您应该遵循其他人所做的事情。

答案 4 :(得分:2)

这完全是一个偏好问题,个人对项目我看到了char *我倾向于在不同的行上声明多个指针。没有真正“正确”的方法来做到这一点,这一切都归结为偏好。有人说它更容易阅读(a)而有些人说(b)更容易在同一行上声明更多相同类型的变量。

我发现(b)更常见,在某些情况下我见过

char * a;

或类似的东西。再次偏好。无论你喜欢什么,或者我正在使用的任何项目,我都会使用(除非我自己写,我使用(a))