首页 > 编程笔记 > C语言笔记 阅读:16

C语言函数返回多个值的方法(附带实例)

在 C 语言程序,当需要从函数中返回一个值时,可以使用返回值。但是,如果想返回多个值,只凭借函数的返回值就无法做到了。

这种情况下,我们可以采用让被调函数修改主调函数内变量的方法,即将指针作为参数传递到被调函数中,类似于 scanf() 函数的用法。
scanf("%d%d%d", &a, &b, &c);  //  scanf函数读取从键盘中输入的3个整型并将其存储到变量a、b、c中
函数如果需要返回多个指针变量,那么可以接收指针的指针,即在之前章节中讨论过的将二级指针作为参数传入被调函数中。通过这种方式,被调函数可以“返回”多个指针。

举个简单的例子:
#include <stdio.h>
void func(int **a, int **b)
{
    static int x = 100;
    static int y = 200;
    *a = &x;
    *b = &y;
}

int main()
{
    // 两个指针,初始化为空
    int *a = NULL;
    int *b = NULL;
    func(&a, &b); // 将指针的指针传入被调函数中
    if (a != NULL && b != NULL)
        printf("a=%d b=%d\n", *a, *b);
    return 0;
}
运行结果为:

a=100 b=200

在 main() 函数中,我们声明了两个指针并将它们初始化为 NULL。

在 C语言中,NULL 是一个特殊的宏定义,表示一个空指针。空指针是一个不指向任何内存地址的指针。通常,NULL 的值被定义为整数常量 0,但它会被转换为指针类型。在实际编程中,我们使用 NULL 来表示一个指针当前没有指向任何有效的内存地址。

将指针初始化为空指针是一种非常好的编码习惯。通常结合指针判空(如 if (a != NULL&& b != NULL))来判断指针是否已指向一个有效地址。

调用 func() 函数后,两个指针均被修改为有效指针,即非零。我们通过判断指针是否为非零来确定函数 func() 是否已经给指针赋值。若指针仍为零,则说明函数 func() 未给指针赋值,我们不应使用没有明确指向的指针。

在函数 func() 内部,&x&y 取得变量 x 和 y 的指针,类型为 int *。为了修改主调函数中的变量,首先对二级指针 a 和 b 进行取值,将 int ** 转换为 int *,然后将 int * 类型的 &x&y 分别赋值给它们。

这与使用一级指针作为参数时的操作类似。当使用一级指针作为参数时,我们首先对一级指针 a 和 b 进行取值,将 int * 转换为 int,然后将 int 类型的 x 和 y 分别赋值给它们。
void func(int *a, int *b)
{
    int x = 100;
    int y = 200;
    *a = x;       // 将 int *转换为 int,再赋值一个 int 给它
    *b = y;       // 将 int *转换为 int,再赋值一个 int 给它
}

void func(int **a, int **b)
{
    static int x = 100;    // 将 int **转换为 int *,再赋值一个 int *给它
    static int y = 200;    // 将 int **转换为 int *,再赋值一个 int *给它
    *a = &x;
    *b = &y;
}

相关文章