前几天我们已经聊过了函数的调用过程,其中我们提到了,main函数也是被其他函数调用的。既然main函数也是被调用的,那么它就一定可以传参,那么它的参数列表到底是什么样子呢?
我们先来看一小段代码:
#include<stdio.h>
int main(int argc,char *argv[],char *envp[])
{
int i = 0;
for(;i<argc;i++)
{
printf("%d -> %s\n",i,argv[i]);
}
printf("%d\n",argc);
return 0;
}
它的运行结果是这个样子的:
因为命令行参数在Linux系统下的应用非常广泛,所以我这里采用的编译环境是在Linux操作系统下的gcc编译器,从代码和运行结果我们可以看出argc其实是代表了参数个数,argv[i]是指向了第i个字符串,在这里我们没有对envp做过多的演示,因为envp这个参数是对环境变量的一些配置,我们平时在编写程序的时候,用到的比较少,如果有兴趣,推荐大家看看《程序员的自我修养》这本书,其中对程序的编译、链接和装载有很深刻的讲解。
其中argv[]数组中存着一个个指针,它们在内存中的存储方式如下:
我们已经知道了argv中存着一个个是字符指针,它指向一个个的字符串,那么这样做有什么好处呢?它能给我们的程序带来什么优势呢?
这样写,可以使程序拥有更多的选项,我们可以给程序中添加多个功能,然后通过命令行参数来选择我们具体要使用哪一个功能。
比如下面这段代码,就可以通过不同的选项来实现加减乘除这个简单的计算功能。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void Add(int a,int b)
{
printf("%d\n",a+b);
}
void Mul(int a,int b)
{
printf("%d\n",a*b);
}
void Sub(int a,int b)
{
printf("%d\n",a-b);
}
void Div(int a,int b)
{
printf("%d\n",a/b);
}
int main(int argc,char *argv[],char *envp[])
{
int a = atoi(argv[2]);
int b = atoi(atgv[3]);
if(strcmp("-a",argv[1]) == 0)
{
Add(a,b);
}
else if(strcmp("-s",argv[1]) == 0)
{
Sub(a,b)
}
else if(strcmp("-m",argv[1]) == 0)
{
Mul(a,b)
}
else if(strcmp("-d",argv[1]) == 0)
{
Div(a,b)
}
return 0;
}