使用指针从函数回传值

一个函数只能返回一个值,这里函数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;
}

glimix.com

使用指针间接带回值

将参数传递给函数时,实际上传递的是此参数的一个拷贝,在函数内部对该参数的修改,改变的即是这个副本的值,这就是函数返回后原值未改变的原因,指针参数也是如此!但把指针变量传递给函数后,却可以带回改变后的值;这是因为解引用操作访问的是指针所指变量的内存空间,虽然指针变量自身是一个拷贝,但对这个拷贝解引用与原指针持有的地址是同一个位置,因此值可以被带回。

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;
}

glimix.com

ZYF

指定参数方向

根据函数是否改变参数的值,可以把参数分为输入型、输出型、输入输出型三种类别。

如:

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;
}

glimix.com

ZYF

陕ICP备2025078817号-1 陕公网安备61011202001108号