C语言中main函数的参数详解

时间:2021-02-13 21:28:53
main函数的定义形式    
    main函数可以不带参数,也可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。所以C99标准中规定只有以下两种定义方式是正确的:
    int main(void) //无参形式
    int main(int argc, char *argv[]) //有参形式
当然有参形式可以进行演变,所以下面的写法也是正确的(同时变量名是可以更换的):
    int main(int argc, char **argv) //有参的另一种形式

为什么可以演变?
    根据前面的一些介绍,可以看出终端传递给main函数的参数是一个二维数组的首地址,这个二维数组的每一维都是一个字符串。既然这样的话就比较好理解了,当我们在调用函数的时候如果传递的是数组首地址的话,那么传递过去的参数会进行退化为指针,比如传递的是int型数组a,接收方接收到的就是一个int *类型的指针,所以这里也是一样,终端传递给main函数的二维数组也会退化成二级指针即char **。

main函数参数的值
再来说一说main函数的参数的值,假设你在终端上运行./test  hello world
那么argc和argv的值分别为多少呢?argc的值为3,而argv里面的字符串也为3个,这是因为你在运行C程序的时候系统默认会把可运行文件的名字也作为一个参数传递给main函数,并且参数的第一个就是可运行文件的名字(会包含详细路径)。

使用main函数的参数
    基于上面的分析,下面继续看看如何使用main函数传递过来的参数,下面一段程序片段是打印出main函数接收到的参数:
for(i=0; i < argc; i++)
    printf("%s\n", *argv++);
这个是没有问题的,另一种操作方式是:
for(i=0; i < argc; i++)
    printf("%s\n", argv[i]);
但是最后的一种方式就是错误的:
for(i=0; i < argc; i++)
    printf("%s\n", *argv[i]);
我最开始尝试的就是这种方式,居然出现错误了,这是为何?argv是一个指针数组名,那么argv[0]、argv[1]这就是一个指针的值啊,然后再使用*p的方式取用里面的数据,怎么会出错呢?最后终于想明白,这是打印的字符串,所以只需要传递数组名或者指针值就可以了!比如定义了
char *p="Hello world.";
如果要打印这个字符串当然使用的是
printf("%s\n", p);
如果打印*p的话,岂不是只取了字符串中的一个H字符,打印当然是会报错的。