C++指针解引用声明语法

3

我对C++非常陌生,有一个(可能相当愚蠢的)问题:

我看到了**运算符(我理解它是解除引用),在两个上下文中都使用了:

char **arglist

char** arglist

这两种语法之间有意义的区别吗?还是它们都完成同样的事情?


5
同样的事情。 - Rakete1111
3
看起来像是一个声明,它表明arglist是一个指向指向char的指针。 - Some programmer dude
3
在这两种情况下都是如此。 - WhozCraig
4
*符号有多种不同的用法。在您的情况下,它不是被用作dereferencing运算符,而是用于声明pointer type。然后可以在这种pointer type上使用相同的符号*来进行dereference操作。因此:int* p;声明pint指针,但int i = *p;dereference p以提取它所指向的int - Galik
哦,@Galik是对的,确实有这样一件事,但有人把它编辑掉了?!我会回滚。 - gsamaras
1
“*”不是一个运算符。它是两个运算符,一个是“”,另一个也是“*”。 - Pete Becker
6个回答

7

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


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

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

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

char** arglist1, arglist2;

定义一个名为 arglist1char** 变量,和一个名为 arglist2char 变量。

因此,要定义两个类型为 char** 的变量,您需要:

char **arglist1, **arglist2;

或者

char** arglist1, **arglist2;

或者,当然:
char**arglist1, **arglist2;

所有三种都是一样的,这只是个人偏好的问题。


1
我个人也喜欢这样,给Kiril加一分,我猜他有成为好同事的潜力! :) - gsamaras
1
声明变量列表更多地是 C 的遗留问题,因此在 C++ 代码中不应该看到这种情况。在 C++ 中,一直鼓励在使用时声明变量。传统上,在 C 中所有的声明都必须放在函数顶部 - 因此有很长的声明列表。 - Galik

4

它们是相同的东西,只是风格不同。

甚至可以这样做:

char ** arglist

白空格被运行时删除。我个人更喜欢 char** arglist,因为它可以帮助我更好地想象对象是什么。

3

它们都完成了同样的事情吗?

是的


这个:

char **arglist;

与此完全相同:

char** arglist;

这是一种语法类型,选择一种方法并坚持下去,这样你的代码看起来更加统一。
请注意,在您的情况下,**不是被用作解引用运算符,而是被用来声明指针类型,正如Galik 提到的那样
另请注意,**由两个星号操作符组成。换句话说,没有**运算符这样的东西。
最后一点,我也更喜欢:char ** arglist;,因为它将变量的类型与变量的名称分开了。
如Kamil所提到的,这个:
char**arglist;

虽然这样也是等效的,但请不要这样做,它会影响可读性!


3
还有,仅仅是为了好玩,char* *arglist 也完全相同。 - Pete Becker
@PeteBecker 谢谢你的点赞!当然,它们很有趣,而且人们应该被鼓励去只是为了好玩使用它们! :) - gsamaras
关于 "char** arglist;,因为它将变量的类型分割开来" -- 当然需要注意的是,这种分割是视觉上的,而不是语法上的。 char* x, y; 定义了 ychar 类型,而不是 char* - Pete Becker
正确,@PeteBecker! - gsamaras

3
两种语法完全相同。但在你的例子中,它们都没有进行解引用*符号用于多种不同的情况。在您的情况下,它不是被用作解引用运算符,而是用于声明一个指针类型。然后可以在这种指针类型上使用相同的符号*解引用它。因此:int* p; 声明 p 为复合类型整数指针,但 int i = *p; 解引用p 来提取它所指向的 int

1
很棒,你发现了那个被其他用户错误地从原帖中丢弃的内容。 - gsamaras

2

没有任何区别。char **arglist和其他方法一样好。


2
是的,但我的键盘有空格键! :) - gsamaras

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;
在每种情况下,它们都意味着相同的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接