main函数解析
平时我们看到的函数都是有参数的,那么平时看到main函数是否有参数呢?答案是肯定的。那我们来看看main函数的原型是什么:
int main(int argc,char *argv[],char *envp[])
{
program-statements
}
这里有三个参数
第一个参数:***argc是个整形变量,表示命令行参数的个数(含第一个参数)
第二个参数:****argv是个字符指针的数组,每个元素是一个字符指针,指向一个字符串。这些字符串就是命令行中的每一个参数(字符串)
第三个参数:****envp是字符指针的数组,数组的每一个元素是指向一个环境变量(字符串)的字符指针。
下面我们看一段代码
#include<stdio.h>
int main(int argc,char *argv[],char *envp[])
{
int i = 0;
for (i = 0; i < argc; i++)
{
printf("%s\n", argv[i]);
}
return 0;
}
我们来看看输出的结果:
我们打开命令行参数:可变参数页
在调试—–>命令参数——>加入“hello”
再查看结果
通过上面的分析,我们可以通过下面这幅图来解释他们
!!!:argv数组的最后一个元素存放了一个NULL的指针。
那第三个参数该如何解释,下面我们再看一段代码
#include<stdio.h>
int main(int argc,char *argv[],char *envp[])
{
int i = 0;
while (envp[i] != NULL)
{
printf("%s\n", envp[i]);
i++;
}
return 0;
}
这里图品显示的内容都是环境变量
!!!envp数组的最后一个元素也存放NULL指针
main函数解析完
可变参数列表解析
c语言的可变参数是通过函数实现为可变参数的形式,进而使函数可以接受多个任意参数
下面我通过一段代码来说明(实现一个函数的平均值)
#include<stdio.h>
#include<stdarg.h>
int average(int n, ...)
{
va_list arg;
int i = 0;
int sum = 0;
va_start(arg, n);
for (i = 0; i < n; i++)
{
sum += va_arg(arg, int);
}
return sum / n;
va_end(arg);
}
int main()
{
int a = 1;
int b = 2;
int c = 3;
int avg1 = average(2, a, c);
int avg2 = average(3, a, b, c);
printf("avg1=%d\n", avg1);
printf("avg2=%d\n", avg2);
return 0;
}
声明一个 va_list类型的变量 arg,它用于访问参数列表的未确定部分。
我们在代码中转到它的定义可以来看一下:
va_list arg就等价于红框所表达的
va_start(arg,n)这个变量是调用va_start来初始化的。他的第一个参数va_list的变量名,第二个参数是省略号前最后一个有名字的参数。初始化过程吧arg变量设置为指向可变参数部分的第一个参数
我们在来看它的定义
为了访问参数,需要用va_stsrt,这个宏接受两个参数:va_list变量和参数列表中下一个参数的类型。在这个例子中所有的可变参数都是整形。va_arg返回这个参数的值,并使用va_arg指向下一个可变参数
我们最后来看它的定义
最后,当访问最后一个可变参数之后,我们需要调用va_list