从函数中返回一个值可以使用返回值,但是如果要返回多个值呢?
你肯定想到了让被调函数修改主调函数内变量的方法---将指针作为参数传递到被调函数中。就像scanf函数那样。
scanf("%d%d%d", &a, &b, &c); // scanf从键盘读入3个整型并存储到变量a,b,c中。
那么,如果函数需要返回多个指针变量呢?
将指针的指针,也就是本节中讨论的二级指针作为参数传入函数。即可让被调函数“返回”多个指针。
void func(int **a, int **b)
{
static int x = 100; static int y = 200;
*a = &x;
*b = &y;
}
#include <stdio.h> 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;
}
在main函数中,声明两个指针并把它们初始化为 NULL 。
NULL 是一个符号常量,由 #define NULL 0 定义的一个符号常量。关于符号常量,请参见变量与常量。
将指针初始化为NULL,也就是将指针内保存的地址设置为0。让指针初始化为零是一个非常好的编码习惯。
一般结合指针判空,即 if (a != NULL && b != NULL) ,来判断指针是不是有一个正确的指向了。
调用函数 func 后,两个指针均被修改为有效指针,即非0。
我们通过判断指针是不是非零来确定函数 func 已经给指针赋值了。
若指针仍然为0,则说明函数 func 并未给指针赋值,不可以使用没有明确指向的指针。
函数 func 内部, &x 、 &y 取得变量 x 、 y 的指针,类型为 int * 。
在被调函数内,为了修改主调函数中的变量,先对二级指针 a、b 取值,将 int ** 转换为 int * ,再赋值一个 int 给它。
类似于使用一级指针作为参数时,先对一级指针 a、b 取值,将 int * 转换为 int ,再赋值一个 int 给它。
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;
static int y = 200;
*a = &x; // int **转换为int *,再赋值一个int *给它
*b = &y; // int **转换为int *,再赋值一个int *给它
}