#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for(i=1;i<argc;i++)
printf("%s%s", argv[i], (i<argc-1)? " ":"");
printf("\n");
return 0;
}
上面给出了一个简单的C程序,用于输出命令行输入。这里的
argc
是参数计数器。argv
被称为包含参数的数组。我的问题是:为什么要将其定义为字符数组的指针而不是普通数组?还有,为什么需要将它的零号元素(argv [0])定义为调用程序的名称。我是一名初学者,请从高层次的角度解释一下。
char *
表示C风格字符串,那么最好称之为“指向字符的指针数组”。换句话说,如果char * x[]
,则意味着x
是一个C风格字符串的数组。 - Brandini=0
开始,然后尝试以不同的方式从 shell 中调用你的命令,例如./foo bar baz
或/path/to/foo bar baz
,并进行实验,看看你的环境是否会传输 argv[0] 时有任何差异。 - Brandinchar *x[]
是一个参数声明,它意味着x
是一个指向指针的指针,它可能指向char*
指针数组的一个元素,也可能不是,并且这些char*
指针可能或可能不指向 C 风格字符串;参数声明并未指定。 - Keith Thompsonchar **x
。是的,char *
并不自动意味着C风格的字符串。此外,有趣的是,C风格字符串的定义没有提供任何可靠的方法来测试某个东西是否是C风格字符串。我不确定它是否在C标准或POSIX中,但我认为在argv
的特殊情况下,规范实现中必须包含一个C风格字符串数组,其最后一个元素的值为(char *)0
。 - Brandin