[英]What does the ** operator mean in C?
**
在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
说得通? 我试图运行的程序令人窒息。 如果我尝试打印它,则会出现分割错误 。
第一个printf将字符串打印得很好。 第二个printf失败。
这是我得到的输出(第一行是正确的):
argv -aps_instance1001-aps_ato0-aps_ipc_debug3
Segementation Fault (core dumped)
“ **在C中有特殊含义吗?”
不,这只是两个取消引用 。
char **argv
表示: argv
两次取消引用是一个char
。 换句话说, argv
是指向char
的指针。
相同的:
“如果是这样,则行:
**argv
说得通?”
声明说**argv
是一个char
。 在运行时, argv
将被取消引用两次; 值是char
即argv
,指针的指针char
,是指向。
**
只是两个*
。
就分段故障而言,看一下行printf("argv %s\\n",argv);
。 printf
需要一个char *
,而不是char **
,因此它正在查看一个指针数组而不是一个字符数组。 printf
试图将所有在argv
处的内容打印为一个字符串,直到遇到零为止,并且可能在找到一个之前就超出了范围。
argv
是一个char **
,它是一个指向指针的指针,或者在这种情况下是一个指针数组。 不要直接打印它,因为它没有外部含义。 (当然,您可以打印指针值。)
*argv
或argv[0]
是char *
,这是指向char
的指针,在这种情况下,这是argv
的第一个字符串。
**argv
是一个char
,在这种情况下,它是argv
第一个字符串的第一个字符。
是。
char ** argv
和...一样
char * argv []
没有。
每个*
引入一个间接级别。 在这种情况下,这意味着argv
是指向指针的指针。 从技术上讲,它实际上不是一个指针数组,可以将其声明为char * argv[]
。
显然,“否”是指**
本身并不特殊。 或者它很特殊,但不要大于或小于*
或***
。
char **argv
与char *argv[]
。
这里argv
是参数向量。
这不是指向指针的指针吗? 如果您知道C#,我认为argv参数前面的**与C#中的ref
具有相同的效果。
尽管字符串“ **
”确实具有明确定义的含义,但我认为问题的答案是“ **”不是一个运算符,而是连续两个“ *
”。
这与Fortran相反,在Fortran中 ,“ **
”是单个令牌,并用作幂运算符。
因此,马丁·贝克特(Martin Beckett ) 很好地涵盖了这个含义,但实际上它不是“运算符”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.