C ++指针参考声明语法

时间:2016-09-21 19:03:55

标签: c++ pointers syntax operators declaration

令人难以置信的C ++新手,并且有一个(可能相当愚蠢)的问题:

我已经看到在两种情况下使用的**运算符(我理解为取消引用解除引用):

char **arglist

char** arglist

语法之间是否存在有意义的差异,还是它们都完成了同样的事情?

6 个答案:

答案 0 :(得分:7)

它们完全一样。但在这种情况下,它们不是“取消引用取消引用”,它们定义了指向char 指针的指针。

我个人更喜欢char** arglist,因为**就像是类型的一部分,它就像:

type var_name; // where `type` is `char**` and `var_name` is arglist

但是,另一方面,它可能会产生误导,因为以下内容:

char** arglist1, arglist2;

定义名为char**的{​​{1}}变量,以及名为arglist1的{​​{1}}变量。

因此,为了定义类型为char的2个变量,您需要

arglist2

char**

或cource:

char **arglist1, **arglist2;

这三者都是一样的,这是个人偏好的问题。

答案 1 :(得分:4)

它们是一样的,它只是风格。

你甚至可以做

char ** arglist

白色空间在运行时被剥离。我个人更喜欢char** arglist因为它有助于我更好地想象对象是什么。

答案 2 :(得分:3)

  

..他们都在完成同样的事情吗?

此:

char **arglist;

与此完全相同:

char** arglist;

这是一种语法,选择一种方法并坚持,以便您的代码看起来是同质的。

请注意,在您的情况下,**未被用作解除引用运算符,它被用于声明指针类型,如Galik mentioned

另请注意**由两位明星运算符组成。换句话说,不存在**运算符。

作为最后的评论,我也更喜欢:char** arglist;,因为它从变量名称中划分变量的类型。

正如卡米尔所说,这:

char**arglist;

是等效的,但请这样做,它会影响可读性!

答案 3 :(得分:3)

两种语法都相同。但是你的例子中没有一个解除引用

*符号用于几个不同的事情。在您的情况下,它不用作解除引用运算符,它用于声明指针类型。然后可以在指针类型上使用相同的符号*取消引用它。因此:int* p;声明p为复合类型 int指针int i = *p; 取消引用 p以提取int它指向的。

答案 4 :(得分:2)

没有差异。char**arglist和其他人一样好。

答案 5 :(得分:2)

无论如何都没有区别。这取决于程序员,有些人更喜欢char* ptr;而有些char *ptr;

对于可添加到该类型的任何限定符都是如此:

  • const int a = 0;int const a = 0;
  • const int& a = b;int const& a = b;
  • int &&a = 0;int && a = 0;

在每种情况下,它们都意味着相同的事情。