**
在C中有什么特殊含义吗?
像这样:
static intparse_one (int argc, char **argv)
{
cmd_line *slot;
int value;
Flag_name flag_name;
int i;
printf("argv %s\n",argv);
printf("argv[0] %c\n",**argv);
如果是,行
**argv
有意义吗?我试图运行的程序令人窒息。如果我尝试打印它,我会得到segmentation fault。
第一个printf打印字符串。第二个printf失败了。
这是我得到的输出(第一行是正确的):
argv -aps_instance1001-aps_ato0-aps_ipc_debug3
Segementation Fault (core dumped)
答案 0 :(得分:9)
“**在C中有什么特殊含义吗?”
不,只有两个dereferences。
char **argv
表示:argv
解除引用两次是char
。换句话说,argv
是指向char
的指针。
同样的:
“如果是这样,该行:
**argv
是否有意义?”
声明称**argv
是char
。在运行时argv
将被解除引用两次;值为char
,argv
指向char
的指针指向。{/ p>
答案 1 :(得分:2)
**
只有两个*
。
就segfault而言,请查看您的行printf("argv %s\n",argv);
。 printf
期望char *
,而不是char **
,因此它会查看指针数组而不是字符数组。 printf
尝试将argv
处的所有内容打印为一串字符,直到遇到零,并且可能在找到之前超出范围。
argv
是char **
,它是指向指针的指针,或者在这种情况下是指针数组。不要直接打印,因为它没有外在意义。 (当然,如果要查看它,可以打印指针值。)
*argv
或argv[0]
是char *
,它是char
的指针,在这种情况下是argv
中的第一个字符串。
**argv
是char
,在这种情况下是argv
中第一个字符串的第一个字符。
答案 2 :(得分:1)
是
char ** argv
与
相同char * argv []
答案 3 :(得分:1)
没有
每个*
都会引入一个间接层。在这种情况下,它意味着argv
是指向指针的指针。事实上,从技术上讲,你可以看到它是一个指针数组 - 它可以被声明为char * argv[]
。
显然,“不”,我的意思是**
本身并不特别。或者它很特别,但不能超过*
或***
。
答案 4 :(得分:1)
char **argv
与char *argv[]
相同。
这里argv
是参数向量。
答案 5 :(得分:0)
这不是指向指针的指针吗?我认为argv参数前面的**与C#中的ref
具有相同的效果,以防你知道C#。
答案 6 :(得分:0)
虽然字符串“**
”确实具有明确的含义,但我认为问题的答案是“**”不是一个运算符,而是连续两个“*
”。
这与Fortran相反,其中“**
”是单个标记,并且充当取幂运算符。
所以意思是well covered by Martin Beckett,但它确实不是“操作员”。