2010-03-08 79 views
1

**在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 

有意义吗?我试图运行的程序令人窒息。如果我尝试打印它,我会得到一个segmentation fault

第一个printf打印出的字符串很好。第二个printf失败。

这里是我得到的输出(第一行是正确的):

argv -aps_instance1001-aps_ato0-aps_ipc_debug3 

Segementation Fault (core dumped) 
+0

“窒息”是什么意思?该比较是有效的;它基本上看看是否第一个参数的第一个字符是连字符。 (这可能不是你的意思,因为第一个参数通常是二进制的名称,而不是getopt样式的标志) – 2010-03-08 19:53:37

回答

9

“难道**在C的任何特殊含义?”

不,它只是两个dereferences

char **argv 

指:argv解除引用两次是char。换句话说,argv是指向char的指针。


同为:

“如果是这样,那么该行:**argv有意义”

声明说**argvchar。在运行时argv将被解除引用两次;值为charargv,指向指向char的指针指向。

0

是不是一个指针的指针?我认为在argv参数前面的**与C#中的ref具有相同的效果,以防您知道C#。

1

是的。

字符** argv的

是一回事

的char * argv的[]

1

*引入了一个间接级。在这种情况下,这意味着argv是一个指向指针的指针。它不是,真的,从技术上讲,你可以看到它是一个指针数组 - 它可以被声明为char * argv[]

显然,通过“否”,我的意思是**本身并不是特别的。或者它是特殊的,但不多也不少于****

1

char **argvchar *argv[]相同。

这里argv是参数向量。

0

虽然字符串“**”确实有明确的含义,但我认为对问题的回答是“**”不是一个运算符,而是两个“*”连续。

这与Fortran形成对比,其中“**”是一个单独的标记并且用作指数运算符。

所以意思是well covered by Martin Beckett,但它确实不是“一个操作员”。

2

**只是两个*

至于段错误,看看你的行printf("argv %s\n",argv);printf预计char *,而不是char **,所以它正在查看指针数组而不是字符数组。 printf正试图在argv处以字符串的形式打印所有内容,直到它遇到一个零,并且可能在找到一个之前超出界限。

argvchar **,它是一个指向指针的指针,或者在这种情况下是一个指针数组。不要直接打印,因为它没有外在含义。 (如果你想看到它,你当然可以打印指针值)。

*argvargv[0]char *,这是一个指向char,在这种情况下是argv的第一个字符串。

**argvchar,在这种情况下,它是argv中第一个字符串的第一个字符。