您的位置:首页 > 编程语言 > C语言/C++

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

2014-09-17 09:33 393 查看
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字符,打印当然是会报错的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: