我对C++非常陌生,有一个(可能相当愚蠢的)问题:
我看到了**
运算符(我理解它是解除引用),在两个上下文中都使用了:
char **arglist
char** arglist
这两种语法之间有意义的区别吗?还是它们都完成同样的事情?
我对C++非常陌生,有一个(可能相当愚蠢的)问题:
我看到了**
运算符(我理解它是解除引用),在两个上下文中都使用了:
char **arglist
char** arglist
这两种语法之间有意义的区别吗?还是它们都完成同样的事情?
它们完全相同。但在这种情况下,它们不是“取消引用的取消引用”,而是定义指向指针的指向 char
的指针。
我个人更喜欢使用 char ** arglist
,因为 **
就像类型的一部分,就像:
type var_name; // where `type` is `char**` and `var_name` is arglist
但是,另一方面,它可能会产生误导,因为以下原因:
char** arglist1, arglist2;
定义一个名为 arglist1
的 char**
变量,和一个名为 arglist2
的 char
变量。
因此,要定义两个类型为 char**
的变量,您需要:
char **arglist1, **arglist2;
或者
char** arglist1, **arglist2;
char**arglist1, **arglist2;
所有三种都是一样的,这只是个人偏好的问题。
C
的遗留问题,因此在 C++
代码中不应该看到这种情况。在 C++
中,一直鼓励在使用时声明变量。传统上,在 C
中所有的声明都必须放在函数顶部 - 因此有很长的声明列表。 - Galik它们是相同的东西,只是风格不同。
甚至可以这样做:
char ** arglist
char** arglist
,因为它可以帮助我更好地想象对象是什么。它们都完成了同样的事情吗?
是的。
这个:
char **arglist;
与此完全相同:
char** arglist;
**
不是被用作解引用运算符,而是被用来声明指针类型,正如Galik 提到的那样。**
由两个星号操作符组成。换句话说,没有**
运算符这样的东西。char ** arglist;
,因为它将变量的类型与变量的名称分开了。
char**arglist;
虽然这样也是等效的,但请不要这样做,它会影响可读性!
char* *arglist
也完全相同。 - Pete Beckerchar** arglist;
,因为它将变量的类型分割开来" -- 当然需要注意的是,这种分割是视觉上的,而不是语法上的。 char* x, y;
定义了 y
为 char
类型,而不是 char*
。 - Pete Becker*
符号用于多种不同的情况。在您的情况下,它不是被用作解引用运算符,而是用于声明一个指针类型。然后可以在这种指针类型上使用相同的符号*
来解引用它。因此:int* p;
声明 p
为复合类型整数指针,但 int i = *p;
解引用了 p
来提取它所指向的 int
。没有任何区别。char **arglist
和其他方法一样好。
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;
arglist
是一个指向指向char
的指针。 - Some programmer dude*
符号有多种不同的用法。在您的情况下,它不是被用作dereferencing运算符,而是用于声明pointer type。然后可以在这种pointer type上使用相同的符号*
来进行dereference操作。因此:int* p;
声明p
为int指针,但int i = *p;
会dereferencep
以提取它所指向的int
。 - Galik