使用指针从函数回传值
一个函数只能返回一个值,这里函数test期望将内部计算的结果通过a,b传出,不过在函数返回后,a,b的值根本没有改变。
// a,b期待作为输出参数带回值
// a,b实际没有发生变化,结果仍为实参值
int test(int a, int b)
{
a = 4;
b = 5;
printf("in test: a=%d, b=%d\n", a, b);
return a * b;
}
int main()
{
int a = 1;
int b = 2;
test(a, b);
printf("in main: a=%d, b=%d\n", a, b);
return 0;
}

使用指针间接带回值
将参数传递给函数时,实际上传递的是此参数的一个拷贝,在函数内部对该参数的修改,改变的即是这个副本的值,这就是函数返回后原值未改变的原因,指针参数也是如此!但把指针变量传递给函数后,却可以带回改变后的值;这是因为解引用操作访问的是指针所指变量的内存空间,虽然指针变量自身是一个拷贝,但对这个拷贝解引用与原指针持有的地址是同一个位置,因此值可以被带回。
int test(int *a, int *b)
{
*a = 4;
*b = 5;
printf("in test: *a=%d, *b=%d\n", *a, *b);
return *a * *b;
}
int main()
{
int a = 1;
int b = 2;
test(&a, &b);
printf("in main: a=%d, b=%d\n", a, b);
return 0;
}

指定参数方向
根据函数是否改变参数的值,可以把参数分为输入型、输出型、输入输出型三种类别。
- 输入,即在函数内部仅使用变量的值,变量自身无需改变;
- 输出,即用一个变量保存函数内部的某些数据供外部使用;
- 输入输出,就是具有前两种功能的参数。
如:
void foo(char a, int *b, float *c)
{
// a是输入参数
printf("%c\n", a);
// b是输出参数
*b = a + 5;
// c即输入又输出
printf("%f\n", *c);
*c = 2.0f;
}
某些环境下,你可能想要更明了的表达这种语义,此时可以通过给参数附带上显式的IN-OUT指示符,方法是使用#define定义空符号量。
#define FLAG // 定义符号
#define MAX 9 // 定义常量
然后在函数声明或定义时使用这些标志值明指示了参数的方向。
#include <stdio.h>
#define IN // 定义输入参数标记
#define OUT // 定义输出参数标记
#define INOUT // 定义输入输出参数标记
void foo(IN char a, OUT int *b, INOUT float *c)
{
// 等同于上面的实现
}
int main()
{
int s;
float pi = 3.14f;
foo('f', &s, &pi);
printf("\n\n");
printf("%c\n", s);
printf("%f\n", pi);
return 0;
}

陕公网安备61011202001108号