main函数参数解析.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

2017ll + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档