【C语言】函数传参


1、函数参数传递的两种方式

1.1、值传递

#include <stdio.h>
/* 变量x、y为Swap函数的形式参数 */
void Swap(int x, int y)
{
    
    
    int tmp;
    tmp = x;
    x = y;
    y = tmp;
    printf("x = %d, y = %d\n", x, y);
}
int main(void)
{
    
    
    int a = 10;
    int b = 20;
    /*变量a、b为Swap函数的实际参数*/
    Swap(a, b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

输出:
x = 20, y = 10
a = 10, b = 20

1.2、地址传递

#include <stdio.h>
void Swap(int* px, int* py)
{
    
    
    int tmp;
    tmp = *px;
    *px = *py;
    *py = tmp;
    printf("*px = %d, *py = %d\n", *px, *py);
}
int main(void)
{
    
    
    int a = 10;
    int b = 20;
    Swap(&a, &b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

输出:
*px = 20, *py = 10
a = 20, b = 10

1.3、C中没有引用传递

如果在.C文件中出现函数参数为引用则出现莫名其妙的错误

void InsertSort(SqList &L);

报错error C2143: syntax error : missing ‘)’ before ‘&’
C++中才有引用传递,C中是没有引用传递的

2、传递结构体

3、传递数组

3.1、数组做为参数传递

  • 数组做为函数的参数需要传递两个参数
    • 数组的地址
    • 数组的元素个数
#include <stdio.h>
void print(int a[],int n)
{
    
    
        int i;
        for(i=0;i<n;i++)
                printf("%d ",a[i]);
        printf("\n");
}
int main()
{
    
    
        int a[3]={
    
    1,2,3};
        int b[5]={
    
    1,2,3,4,5};
        print(a,3);
        print(b,5);
        return 0;
}

3.2、不允许将数组做为返回值

只需要向函数中传递数组,不需要返回数组。不允许也无意义。
因为函数中操作的形参数组值发生了改变,实参也会跟着变化。

#include <stdio.h>
void print(int a[],int n)
{
    
    
        int i;
        for(i=0;i<n;i++)
                printf("%d ",a[i]);
        printf("\n");
}
void add(int a[],int n)
{
    
    
        int i;
        for(i=0;i<n;i++)
                a[i]<<=1;
}
int main()
{
    
    
        int a[5]={
    
    1,2,3,4,5};
        print(a,5);
        add(a,5);//对数组a里的值进行数值变化
        print(a,5);//再输出数组a的值已发生了变化
        return 0;
}

输出:
1 2 3 4 5
2 4 6 8 10

4、形参为空

  • 形参为空表示,传参不定,可传可不传。
  • 传什么值都能编译通过
#include <stdio.h>
#include <string.h>
char *getStr()//形参为空表示,传参不定,
{
    
    
        return "Hello world";
}

int main()
{
    
    
        char str[100]="";
        strcpy(str,getStr(1,"aa"));
        printf("%s\n",str);
        return 0;
}
  • 如果不允许传参,形参可以为void
char *getStr(void)
{
    
    
	//... ...
}

5、不定长参数表

如C语言内置函数printf

int printf(const char *format,...);

5.1、不定长参数表的原理

不定长参数表依赖三个函数。这三个函数的头文件是<stdarg.h>,其实下面的三个函数都是一个宏定义(macro)。
这三个函数是:

void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);

5.2、va_list

va_list型的变量,这个变量是指向参数的指针

5.3、va_start

初始化定义的va_list变量,使其指向第一个可变参数的地址。

5.4、va_arg

返回可变参数,va_arg的第二个参数是你要返回的参数的类型(如果多个可变参数,依次调用va_arg获取各个参数)

  • 第二个参数如果传char或short会被提升为int
  • 第二个参数如果传float会被提升为double

5.5、va_end

结束可变参数的获取

5.6、不定长参数举例

例一:

#include <stdio.h>
#include <stdarg.h>
int max(int n, ...)
{
    
    
    va_list v;                      //定义va_list变量
    va_start(v, n);                 //使v指向第一个参数的地址
    int i;
    int maxvalue = va_arg(v, int);//获得第一个参数
    
    for (i = 1; i < n; i++) {
    
    
        int data = va_arg(v, int);//依次获取参数列表中的每个参数
        if (data > maxvalue)
            maxvalue = data;       
    }
    va_end(v);
    return maxvalue;
}

int main()
{
    
    
    printf("%d\n", max(2, 2, 5));
    printf("%d\n", max(3, 4, 1, 6));
    return 0;
}

例二:

#include <stdio.h>
#include <stdarg.h>
void print(int n, ...)
{
    
    
    va_list v;
    va_start(v, n);
    int i;
    for (i = 0; i < n; i++)
    {
    
    
        puts(va_arg(v, char*));

    }
    va_end(v);

}
int main()
{
    
    
    print(2, "hello", "word");
    return 0;
}

输出:
hello
world

猜你喜欢

转载自blog.csdn.net/chuhe163/article/details/103865556