- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
main函数参数解析
main函数参数解析
在我们日常编写C语言程序时,必不可少的是main函数,那么在标准C的环境下,main函数的写法有下面两种:
①:int main(void)
②:int main(int argc,char **argv) 第一种写法为不带参数的main函数,这个我们就不再讨论了。但是第二种,很多人就比较纠结,argc和argv又是什么呢?这就是我们这次需要讨论的问题。
第二种标准写法中,argc表示的是执行此程序时,读入的字符串个数;argv是个指针数组,用来存放读入的字符串。那么我们可以看一下下面的程序:
#include stdio.h
int main(int argc,char *argv[])
{
int i = 0;
for(i = 0 ;i argc;i++)
{
printf(第%d个参数:%s\n,i,*++argv);
}
return 0;
}
程序运行如上图,在Shell下运行,当执行./Test Hello world后,程序输出的./Test、Hello、world这三个那么我们从这里也可以看出来argc的值为3。
根据标准main函数的解释,argc为传入字符串的个数,argv中存放对应的字符串。
那么我们现在在更改下程序,我在程序中再加入一个字符串数组,同样的,在输出环节也输出后加入的字符串数组,为了方便我在这里就给字符串数组限定为3个字符串。
#include stdio.h
int main(int argc,char *argv[])
{
int i = 0;
char *Tag[] = {Hello,World,xiaozhi};
for(i = 0 ;i argc;i++)
{
printf(第%d个参数:%s\n,i,*argv++);
printf(第%d个参数:%s\n,i,*Tag++);
}
return 0;
}
但是我们在这次编译中却出现了一个错误,编译器告诉我们“error: cannot increment value of type char *[3]”,即不可进行增量运算。
那么同样是字符串数组,为什么argv可以,而自定义的字符串数组Tag不可以呢?其实这个问题,如果各位看过标准C的蓝皮书,那么这个问题很容易就能理解。
我们知道数组名实际上是个常量,是不可以被直接修改的,那就意味这数组名是不可以进行增量运算的,这就是数组与指针最大的区别。而上面的问题中,argv与Tag最大的一个区别是,前者为函数参数,后者为局部变量。
那么我们可以从以下两个方面来理解这个问题:
1、蓝皮书中提到过标准main函数的两种写法,在蓝皮书中main函数的的原型中argv实际是:char **argv,但是类似于我们写的程序中char *argv[]这种写法,gcc在编译时会有一个隐式转换,会将我们的这种写法自动转换为char **argv,但是这种写法一般会出现两种写法,要么就是编译器直接报错,要么就会给出warning信息,然后继续把它转换为char **argv来使用。
2、另一方面,C语言在函数传参的数组传递有些特殊,我们可以看下面的代码:
#include stdio.h
int func(char *v[])
{
*++v;
printf(v=%x\t v=%x\n,v,v);
}
int main(int argc, char const* argv[])
{
char const* arr[]={1,2,3};
printf(argv=%x\t argv=%x\n,argv,argv);
printf(argc=%x\t argc=%x\n,argc,argc);
func(argv);
return 0;
} 因为main函数是程序的入口函数,是被编译内部定义好的,所以可以再定义一个int func(char *v[]),结果发现这个v仍然可以进行左值操作。
上面说了参数中数组的传递有些特殊,因为在实际处理参数中的数组时,其实编译器是把它当成一个指针来处理。
比如你定义好一个数组char arr2[10];`假定有一个函数,其原型如下:
int func2(char p
文档评论(0)