Explicación detallada de la lista de parámetros variables del lenguaje C (archivo de encabezado stdarg y sus macros definidas)

        Prólogo: cuando se definen algunas funciones, los parámetros en () no son todos los parámetros de función son únicos, como la definición de la función printf

Los puntos suspensivos aquí significan que los parámetros de la función printf se pueden cambiar y los parámetros de algunas funciones son fijos, como strlen

La razón de esta diferencia se debe principalmente a que las funciones de las funciones son diferentes: la función printf necesita imprimir varios tipos diferentes de datos, mientras que la función strlen calcula la longitud de la cadena y solo necesita pasar la dirección de la cadena. El uso de la lista de parámetros variables puede resolver muy bien nuestras necesidades, y la implementación de la lista de parámetros variables se realiza a través del archivo de encabezado <stdarg>, que se presentará en detalle a continuación;

2. Introducción a los archivos de encabezado stdarg

        Concepto básico: definir macros para manejar funciones de tipo desconocido y número desconocido de parámetros

         Cómo utilizar: agregue... después de los parámetros básicos para representar el tipo desconocido y la cantidad de parámetros desconocidos

Introducción a va_list

  Prototipo:               typedef char* va_list;

    va_list es un puntero a una lista de parámetros variables (nota: es un puntero a toda la lista de parámetros variables y no apunta al primer parámetro; el puntero al primer parámetro debe realizarse a través de va_start)

        va_list arg; define una variable arg de tipo de datos va_list para la operación de la lista de parámetros variables

Introducción a va_start

        Ejemplo:            void va_start(va_list ap, last_arg);

         Específicamente: va_start tiene dos parámetros, el primero es una variable de tipo de datos va_list (es decir, un puntero a la lista de parámetros variables) y el segundo es el parámetro más cercano antes de la lista de parámetros variables (es decir, ... anterior)

        Función: Inicialice la lista de parámetros variables, apunte el puntero al primer parámetro de la lista de parámetros variables, para que el programa pueda acceder a cada parámetro de la lista de parámetros variables uno por uno:

        va_start(arg,num); num es el parámetro de función que configuré yo mismo (el parámetro más reciente antes...)

    

Introducción a va_arg

        

        Uso: Obtenga cada parámetro de la lista de parámetros variables y devuélvalo, y apunte el puntero al siguiente parámetro al mismo tiempo;

        va_arg(arg,doble);

Introducción de va_end

        

         Función: finalizar el acceso a la lista de parámetros variables y liberar recursos

2. Un ejemplo sencillo (encontrar el promedio de cualquier parámetro)

#include <stdio.h>
#include <stdarg.h>
/*函数声明部分*/
double average(int num, ...)
{
    /*定义一个可变参数列表*/
    va_list valist;

    /*初始化可变参数列表,使其指向可变参数列表的第一个参数*/
    va_start(valist, num);

    int i = 0;
    double sum = 0.0;//用于存储总和
    for (i = 0; i < num; i++)
    {
        /*访问可变参数列表的每一个值,并将其返回*/
        sum += va_arg(valist, double);
    }

    /*清理valist所占用的内存*/
    va_end(valist);
    return sum / num;
}
int main()
{
    /*存储任意参数*/
    double a = average(10, 12.0, 23.0, 34.0, 45.0, 56.0, 76.0, 32.0, 33.0, 11.0, 90.0);
    double b = average(5, 22.3, 44.2, 14.5, 66.3, 99.5);
    printf("平均值=%.2lf\n", a);
    printf("平均值=%.2lf\n", b);
    return 0;
}

Resumen: Pasos para diseñar un programa utilizando listas de argumentos variables

1. Escriba la función correspondiente, agregue parámetros fijos y ... en la parte de parámetros de función para representar la lista de parámetros variables;

2. Defina una variable de tipo va_list como una lista de parámetros variables;

3. Utilice va_start para inicializar la lista de parámetros variables, de modo que el puntero apunte al primer parámetro de la lista de parámetros variables;

4. Utilice va_arg para acceder continuamente a cada parámetro de la lista de parámetros variables, obtener sus parámetros y señalar el siguiente parámetro al mismo tiempo;

5. Utilice va_end para limpiar la memoria de la lista de parámetros variables y liberar recursos;

        Consejo: asegúrese de prestar atención al formato cuando lo use. El nombre de la lista de parámetros variables puede ir seguido directamente de va_list; el primer parámetro de va_start (,) es el nombre de la lista y el segundo es el parámetro fijo. en la función (como num en el código anterior); va_arg( , ) el primer parámetro es el nombre de la lista, el segundo parámetro es el tipo de datos del parámetro variable; el parámetro va_end() es el nombre de la lista;

Supongo que te gusta

Origin blog.csdn.net/Mylvzi/article/details/130693975
Recomendado
Clasificación