C语言函数返回多个值的方法(附带实例)
在 C 语言程序,当需要从函数中返回一个值时,可以使用返回值。但是,如果想返回多个值,只凭借函数的返回值就无法做到了。
这种情况下,我们可以采用让被调函数修改主调函数内变量的方法,即将指针作为参数传递到被调函数中,类似于 scanf() 函数的用法。
举个简单的例子:
在 C语言中,NULL 是一个特殊的宏定义,表示一个空指针。空指针是一个不指向任何内存地址的指针。通常,NULL 的值被定义为整数常量 0,但它会被转换为指针类型。在实际编程中,我们使用 NULL 来表示一个指针当前没有指向任何有效的内存地址。
在函数 func() 内部,
这与使用一级指针作为参数时的操作类似。当使用一级指针作为参数时,我们首先对一级指针 a 和 b 进行取值,将 int * 转换为 int,然后将 int 类型的 x 和 y 分别赋值给它们。
这种情况下,我们可以采用让被调函数修改主调函数内变量的方法,即将指针作为参数传递到被调函数中,类似于 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 来表示一个指针当前没有指向任何有效的内存地址。
调用 func() 函数后,两个指针均被修改为有效指针,即非零。我们通过判断指针是否为非零来确定函数 func() 是否已经给指针赋值。若指针仍为零,则说明函数 func() 未给指针赋值,我们不应使用没有明确指向的指针。将指针初始化为空指针是一种非常好的编码习惯。通常结合指针判空(如 if (a != NULL&& b != NULL))来判断指针是否已指向一个有效地址。
在函数 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; }