以指针为参数的可变参数函数 可变参数函数之和

问题描述

程序应该打印给定数组(大小为 8)的前三个、五个和八个元素的总和。 我已经能够像这样在 main 函数中传递指针:

代码

#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
int  sum (int count,int data[],...) {
    int res=0;
    for(int i=0;i<count;i++)
    {
        res=res+data[i];   
    }
    return res;
}
int main(){
    int elements[8]={11,2,33,5,8,48,-8};
    int three_elements;
    int five_elements;
    int eight_elements;
    three_elements=sum(3,&elements[0],&elements[1],&elements[2]);
    five_elements=sum(5,&elements[2],&elements[3],&elements[4]);
    eight_elements=sum(8,&elements[4],&elements[5],&elements[6],&elements[7]);
    printf("First Three elements sum:%d\n",three_elements);
    printf("First five elements sum:%d\n",five_elements);
    printf("First eight elements sum:%d",eight_elements);
    return 0;
}

输出

前三个元素和:46
前五个元素和:59
前八个元素总和:101

如何将参数直接传递到 sum 函数中?我试图这样做,但编译器不断给我错误

代码

#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
int  sum (int count,int* data[],elements[0],elements[1],elements[2]);
    five_elements=sum(5,elements[2],elements[3],elements[4]);
    eight_elements=sum(8,elements[4],elements[5],elements[6],elements[7]);
    printf("First Three elements sum:%d\n",eight_elements);
    return 0;
}

解决方法

可变参数函数之和

看看man

va_start() 宏初始化 ap 以供 va_arg() 和 va_end() 后续使用,并且必须先调用。

va_arg() 宏扩展为一个表达式,该表达式具有调用中下一个参数的类型和值。参数 ap 是由 va_start() 初始化的 va_list ap。每次调用 va_arg() 都会修改 ap 以便下一次调用返回下一个参数。参数类型是一个指定的类型名,这样就可以通过在类型上加一个 * 来获得指向具有指定类型的对象的指针的类型。

没有指针,您可以通过以下方式进行:

#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>

int  sum (int len,int value,...) {
    va_list args; // initialize va_list

    int res = value;
    va_start(args,value); // start va
    for (int i = 1; i < len; i++) // iterate over other arguments
        res += va_arg(args,int); // add the next argument to res
    va_end(args); // don't forget to end va
    return res;
}
int main(){
    int elements[8]={11,2,33,5,8,48,-8};
    int three_elements;
    int five_elements;
    int eight_elements;
    three_elements=sum(3,elements[0],elements[1],elements[2]);
    five_elements=sum(5,elements[2],elements[3],elements[4]);
    eight_elements=sum(8,elements[4],elements[5],elements[6],elements[7]);
    printf("First Three elements sum:%d\n",three_elements);
    printf("First five elements sum:%d\n",five_elements);
    printf("First eight elements sum:%d\n",eight_elements);
    return 0;
}

为了通过指针获得总和,您可以通过以下方式进行:

#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>

int  sum (int len,int *value,...) {
    va_list args; // initialize va_list

    int res = *value;
    va_start(args,*value); // start va
    for (int i = 1; i < len; i++) // iterate over other arguments
        res += (int)*va_arg(args,int*); // add the next argument to res
    va_end(args); // don't forget to end va
    return res;
}
int main(){
    int elements[8]={11,&elements[0],&elements[1],&elements[2]);
    five_elements=sum(5,&elements[2],&elements[3],&elements[4]);
    eight_elements=sum(8,&elements[4],\
        &elements[5],&elements[6],&elements[7]);
    printf("First Three elements sum:%d\n",eight_elements);
    return 0;
}

输出:

First Three elements sum:46
First five elements sum:59
First eight elements sum:101