令人难以置信的C ++新手,并且有一个(可能相当愚蠢)的问题:
我已经看到在两种情况下使用的**
运算符(我理解为取消引用解除引用):
char **arglist
char** arglist
语法之间是否存在有意义的差异,还是它们都完成了同样的事情?
答案 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;
在每种情况下,它们都意味着相同的事情。