欢迎来到天天文库
浏览记录
ID:27707224
大小:67.24 KB
页数:5页
时间:2018-12-04
《main函数参数解析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、main函数参数解析在我们口常编写C语言程序时,必不可少的是main函数,那么在标准C的环境下,main函数的写法有下面两种:①:intmain(v()id)②:intmain(iiitargc,char**argv)弟一种写法为不带参数的main函数,这个我们就不再讨论了。但是第二种,很多人就比较纠结,argc和argv又是什么呢?这就是我们这次需要讨论的问题。第二种标准写法中,argc表示的是执行此程序时,读入的字符串个数;argv是个指针数组,用来存放读入的字符串。那么我们可以看一下下面的程序:#include〈s
2、tdio.h〉intmain(ir.targc,char*argv[]){inti=0;for(i二0;i〈argc;i++){printf('祐%d个参数:%s,i,*++argv);0;•©_」Dome—bash—80x24xiaozhi—cc:Domexiaozhi_cc$moreTest.c痒includeintmain(intargc,char*argv[】)inti=0;//char*Tag(l={"Hello••广World","xiaozhiM};for(i=0;i3、)printf•第如个参数:%s",i,*argv++);//printf<••第姑个参数:%sMfif*Tag*+);}return0;xiaozhi-cc:Domexiaozhi一ccSgccTest.c-oTestxiaozhi-cc:Domexiaozhi_cc$./TestHelloworld第0个参数:./Test第1个参数:Hello第2个参数:worldxiaozhi-cc:Domexiaozhi_cc$程序运行如上图,在Shell下运行,当执行./TestHelloworld后,程序输出的./T4、est、Hello,world这三个那么我们从这里也可以看出来argc的值为3。根据标准main函数的解释,argc力传入字符串的个数,argv中存放对应的字符串。那么我们现在在更改下程序,我在程序中再加入一个字符串数组,同样的,在输出环节也输出后加入的字符串数组,为了方便我在这里就给字符串数组限定为3个字符串。main(intargc,char*argv口)};,i,氺argv++);,i,*Tag++);inti=0;char*Tag[]={"Hello'for(i=0;i5、参数:printf("策%d个参数:}LDome-bash—80x24xiaozhi-cc:Domexiaozhi_ccSgccTest.c-oTestTest.c:10:46:cannotincrementvalueoftype'char本[3]printf(••第%(1个参數:*s",i,*Tag++);1errorgenerated.xiaozhi-cc:DomexiaozhiccS但是我们在这次编译中却出现了一个错误,编译器告诉我们error:cannotincrementvalueoftype?char*[6、3],’’,KP不可进行增量运算。那么同样是字符串数组,为什么argv可以,而自定义的字符串数组Tag不可以呢?其实这个问题,如果各位看过标准C的蓝皮书,那么这个问题很容易就能理解。我们知道数组名实际上是个常量,是不可以被直接修改的,那就意味这数组名是不可以进行增量运算的,这就是数组与指针最大的区别。而上面的问题中,argv与Tag最大的一个区别是,前者为函数参数,后者为局部变景。那么我们可以从以下两个方面来理解这个问题:1、蓝皮书中提到过标准main函数的两种写法,在蓝皮书中main函数的的原型中argv实际是:cha7、r**argv,但是类似于我们写的程序中char*argv□这种写法,gCC在编译时会右一个隐式转换,会将我们的这种写法自动转换为char**argv,但是这种写法一般会出现两种写法,要么就是编译器直接报错,要么就会给出warning信息,然后继续把它转换为Char**argv来使用。2、另一方面,C语言在函数传参的数组传递有些特殊,我们可以看下面的代码:MBn1{}Iiijp8、onst*argv口)si*arr[]={","2","3"};printf(•gv=%x’,&argv,argv);printf(、gc=%x'&argc,argc);func(argv);},因为main函数是程序的入口函数,是被编译内部定义好的,所以可以再定义一个intfunc(char*v口),结果发
3、)printf•第如个参数:%s",i,*argv++);//printf<••第姑个参数:%sMfif*Tag*+);}return0;xiaozhi-cc:Domexiaozhi一ccSgccTest.c-oTestxiaozhi-cc:Domexiaozhi_cc$./TestHelloworld第0个参数:./Test第1个参数:Hello第2个参数:worldxiaozhi-cc:Domexiaozhi_cc$程序运行如上图,在Shell下运行,当执行./TestHelloworld后,程序输出的./T
4、est、Hello,world这三个那么我们从这里也可以看出来argc的值为3。根据标准main函数的解释,argc力传入字符串的个数,argv中存放对应的字符串。那么我们现在在更改下程序,我在程序中再加入一个字符串数组,同样的,在输出环节也输出后加入的字符串数组,为了方便我在这里就给字符串数组限定为3个字符串。main(intargc,char*argv口)};,i,氺argv++);,i,*Tag++);inti=0;char*Tag[]={"Hello'for(i=0;i5、参数:printf("策%d个参数:}LDome-bash—80x24xiaozhi-cc:Domexiaozhi_ccSgccTest.c-oTestTest.c:10:46:cannotincrementvalueoftype'char本[3]printf(••第%(1个参數:*s",i,*Tag++);1errorgenerated.xiaozhi-cc:DomexiaozhiccS但是我们在这次编译中却出现了一个错误,编译器告诉我们error:cannotincrementvalueoftype?char*[6、3],’’,KP不可进行增量运算。那么同样是字符串数组,为什么argv可以,而自定义的字符串数组Tag不可以呢?其实这个问题,如果各位看过标准C的蓝皮书,那么这个问题很容易就能理解。我们知道数组名实际上是个常量,是不可以被直接修改的,那就意味这数组名是不可以进行增量运算的,这就是数组与指针最大的区别。而上面的问题中,argv与Tag最大的一个区别是,前者为函数参数,后者为局部变景。那么我们可以从以下两个方面来理解这个问题:1、蓝皮书中提到过标准main函数的两种写法,在蓝皮书中main函数的的原型中argv实际是:cha7、r**argv,但是类似于我们写的程序中char*argv□这种写法,gCC在编译时会右一个隐式转换,会将我们的这种写法自动转换为char**argv,但是这种写法一般会出现两种写法,要么就是编译器直接报错,要么就会给出warning信息,然后继续把它转换为Char**argv来使用。2、另一方面,C语言在函数传参的数组传递有些特殊,我们可以看下面的代码:MBn1{}Iiijp8、onst*argv口)si*arr[]={","2","3"};printf(•gv=%x’,&argv,argv);printf(、gc=%x'&argc,argc);func(argv);},因为main函数是程序的入口函数,是被编译内部定义好的,所以可以再定义一个intfunc(char*v口),结果发
5、参数:printf("策%d个参数:}LDome-bash—80x24xiaozhi-cc:Domexiaozhi_ccSgccTest.c-oTestTest.c:10:46:cannotincrementvalueoftype'char本[3]printf(••第%(1个参數:*s",i,*Tag++);1errorgenerated.xiaozhi-cc:DomexiaozhiccS但是我们在这次编译中却出现了一个错误,编译器告诉我们error:cannotincrementvalueoftype?char*[
6、3],’’,KP不可进行增量运算。那么同样是字符串数组,为什么argv可以,而自定义的字符串数组Tag不可以呢?其实这个问题,如果各位看过标准C的蓝皮书,那么这个问题很容易就能理解。我们知道数组名实际上是个常量,是不可以被直接修改的,那就意味这数组名是不可以进行增量运算的,这就是数组与指针最大的区别。而上面的问题中,argv与Tag最大的一个区别是,前者为函数参数,后者为局部变景。那么我们可以从以下两个方面来理解这个问题:1、蓝皮书中提到过标准main函数的两种写法,在蓝皮书中main函数的的原型中argv实际是:cha
7、r**argv,但是类似于我们写的程序中char*argv□这种写法,gCC在编译时会右一个隐式转换,会将我们的这种写法自动转换为char**argv,但是这种写法一般会出现两种写法,要么就是编译器直接报错,要么就会给出warning信息,然后继续把它转换为Char**argv来使用。2、另一方面,C语言在函数传参的数组传递有些特殊,我们可以看下面的代码:MBn1{}Iiijp8、onst*argv口)si*arr[]={","2","3"};printf(•gv=%x’,&argv,argv);printf(、gc=%x'&argc,argc);func(argv);},因为main函数是程序的入口函数,是被编译内部定义好的,所以可以再定义一个intfunc(char*v口),结果发
8、onst*argv口)si*arr[]={","2","3"};printf(•gv=%x’,&argv,argv);printf(、gc=%x'&argc,argc);func(argv);},因为main函数是程序的入口函数,是被编译内部定义好的,所以可以再定义一个intfunc(char*v口),结果发
此文档下载收益归作者所有