C++学习:第二章C语言基础 - (十一)函数传参

版权声明:共享知识,欢迎转载 https://blog.csdn.net/kakiebu/article/details/82856004

1. 调用

方法与函数之间的调用成为值传递,只是单纯的复制值进行传递。

形参是函数调用放向函数传递数据用的。

在C语言中,如果方法的参数表是空的,说明参数表的类型和个数不定,因此可以传参

C语言中的数组传参方式

#include <stdio.h>

void print(int a[], int len)
{

}

int main(){

    int a[5] = {1,2,3,4,5};
    int b[6] = {11,22,33,44,55,66};

    print(a,5);
    print(b,6);

    return 0;
}

这个例子说明形参数组和实参数组是同一个数组,因为这边传递的是地址

函数每次被调用形参都会被创建,初始化为实参。

 

2. 不定长参数

C语言中对不定参数的支持

以printf为例子,man函数定义可以发现

int printf(const char *format, …);

va_start、va_arg、va_end、va_list 用来处理不定长参数表

man  va_start查看详情

 

我们可以这么写,第一个5代表在后面5个数中选最大

max(5,18,55,33,566,22)

max(“%d%d%d%d%d” ,18,55,33,566,22)

简化为:

int max(int n, …),下面这段代码介绍不定长的几个函数用法

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

int max(int cnt, …){

    va_list v;//保存可变长参数表,va_list是个类型

    va_start(v, cnt);//用v保存cnt之后的那么参数表

    int i;

    int maxVal = va_arg(v, int);//从参数表中取出第一个int类型的参数

    for(i=1; i<cnt; i++){

        int data = va_arg(v, int);

        if(data > manVal){

            manVal = data;

        }
    }       

    va_end(v);//终止或者是释放可变长参数表

    return maxVal;

}



int main(){

    printf(“%d\n”,max(5,18,55,33,566,22));

return 0;

}

下面这段代码是说不定长函数在传参时需要注意的 类型提升问题 和 字符串数组的传参问题(就是一个地址)。

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

int max(int cnt, …){

    va_list v;//保存可变长参数表,va_list是个类型

    va_start(v, cnt);//用v保存cnt之后的那么参数表

    int i;

    int maxVal = va_arg(v, int);//从参数表中取出第一个int类型的参数

    for(i=1; i<cnt; i++){

        int data = va_arg(v, int);

        if(data > manVal){

            manVal = data;

        }
    }       

    va_end(v);//终止或者是释放可变长参数表

    return maxVal;
}



void printchar(int , cnt, …){

    va_list v;

    vs_start(v, cnt);

    int i;

    for(i=0; i<cnt; i++){

        //这个地方应该是int 不是 char ,因为在传递过程中char 会被提升为 int,单数输出格式%c 不用修改。类似的还有 short 等。小于int 用int,小于double 用 double
        //char short – int
        //float     -- double
        printf(“%c”,va_arg(v, char));

    }

    printf(“\n”);
    va_end(v);
}



void printstring(int , cnt, …){

    va_list v;

    va_start(v, cnt);

    int i;

    for(i=0; i<cnt; i++){

        puts(va_arg(v, char*));//字符串就是一个char地址!注意
        //printf(“%s\n”, va_arg(v, char*));//这两个写法是一样的
    }

    printf(“\n”);

    va_end(v);
}



int main(){

    printf(“%d\n”,max(5,18,55,33,566,22));

    printchar(3, ‘a’, ‘vv, ‘tt’);

    printstring(3, “hello”, “good”, “world”);

    return 0;
}

 

猜你喜欢

转载自blog.csdn.net/kakiebu/article/details/82856004