编写c语言时 main函数必不可少,main函数参数解析.doc

main函数参数解析

main函数参数解析

在我们日常编写C语言程序时,必不可少的是main函数,那么在标准C的环境下,main函数的写法有下面两种:

①:int main(void)

②:int main(int argc,char **argv)第一种写法为不带参数的main函数,这个我们就不再讨论了。但是第二种,很多人就比较纠结,argc和argv又是什么呢?这就是我们这次需要讨论的问题。

第二种标准写法中,argc表示的是执行此程序时,读入的字符串个数;argv是个指针数组,用来存放读入的字符串。那么我们可以看一下下面的程序:

#include

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

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

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 a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值