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

kee*_*eda 80 c c++ pointers coding-style

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

(a) char* p;
Run Code Online (Sandbox Code Playgroud)

代替

(b) char *p;
Run Code Online (Sandbox Code Playgroud)

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

char* c;
Run Code Online (Sandbox Code Playgroud)

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

char* c, *d;
Run Code Online (Sandbox Code Playgroud)

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

char *c, *d;
Run Code Online (Sandbox Code Playgroud)

谢谢.

Bla*_*ack 94

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

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

  • 其他人建议永远不要在同一声明中声明几个对象.:-) (28认同)
  • 我强调语法背后的逻辑,因此我更喜欢:`int*p`,意思是:当`p`被解除引用时,我得到一个`int`.然后由`,`分隔的多个声明是有意义的:`int*p,*q,r`(当`p`或`q`被解除引用时我得到一个'int`,当`r`被引用时我得到一个`int `).此外,函数指针语法是有意义的:`int(*f)()`(当`f`被解除引用并被调用时我得到一个`int`).这是有道理的:`int*p,(*f)()`. (5认同)
  • 这帮助我认识到论点的另一面是正确的。我主要是类型高的程序员。并更喜欢`int *`。对我来说,`int * p,(* f)()`没有多大意义,但是我可以看到在某些情况下对某些人会有什么影响。 (2认同)

ike*_*ami 49

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

char* p;  // p is a pointer to a char.
Run Code Online (Sandbox Code Playgroud)

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

  • @ user1170330,因为在一次放置它是类型定义的一部分,而在另一个放置它是一个取消引用运算符.没关系.如果有的话,它们看起来不同是一件好事,因为不同的东西应该看起来不同. (12认同)

Geo*_*aál 30

如何写是没有区别的.但是如果你想在一行中声明两个或更多指针更好地使用(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.
Run Code Online (Sandbox Code Playgroud)

  • `typedef`当然不是更好的方式.有些人可能更喜欢它,但如果有多个人使用您的代码,则会出现问题.如果我不习惯'PCHAR`,我可能会写一些类似`PCHAR*p;`的东西,这将是一个`char**`而不是我想要的东西.一般来说,如果你想要一个`char**`,你必须编写`PCHAR*`或者定义一个新类型,然后它才开始变得愚蠢. (5认同)
  • 如果需要一些复杂的指针类型,如指向函数的指针,那么生成typedef是个好主意.在这种情况下,它们使代码更简单.另一方面,使用PCHAR比日常实践更具综合性.但它显然可以满足您的需求.*然后它开始变得愚蠢*请指出所有投诉到Stroustrup :-) (3认同)

jnn*_*nnn 9

妥协是

char * p;
Run Code Online (Sandbox Code Playgroud)

K&R使用

char *p;
Run Code Online (Sandbox Code Playgroud)

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

  • 我学到了很难的方法,char*x,y并不意味着y是一个char*.现在我可以看出为什么K&R遵循上述风格. (3认同)