main函数的参数解析和可变参数列表分析

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


猜你喜欢

转载自blog.csdn.net/qq_42321594/article/details/81266384