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字符,打印当然是会报错的。
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字符,打印当然是会报错的。
相关文章推荐
- C/C++语言中的main函数,参数argc,argv的作用
- C# main函数详解及参数应用
- Go语言中一些不常见的命令参数详解
- c语言main函数返回值、参数详解
- main函数参数详解
- C语言中的system函数参数详解
- Main函数中的参数argc,argv的使用详解
- C 中的main函数的参数详解
- R 语言绘图006-绘图参数设置函数par()详解
- R 语言绘图004-legend()参数详解
- go语言:函数参数传递详解
- 深入Main函数中的参数argc,argv的使用详解
- c语言学习--main函数的参数
- 一起talk C栗子吧(第五十七回:C语言实例--main函数的参数)
- 一起talk C栗子吧(第一百二十七回:C语言实例--查看main函数的参数)
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.4 控制器参数绑定
- Linux字符集和系统语言设置-LANG,locale,LC_ALL,POSIX等命令及参数详解
- golang实战使用gin+xorm搭建go语言web框架restgo详解3 系统常用配置参数
- (转)main函数参数详解