将指针传递给函数并进行更改

时间:2014-03-15 15:13:46

标签: c pointers

我正在从事编程工作,并且在使用指针时遇到了一些麻烦。下面的代码示例不是来自我的作业,而是说明了我遇到的问题。我试图将指针传递给另一个函数(从更改到真正),并让该函数创建一个新对象然后返回它。但是,我发现原始对象并没有真正改变。我无法弄清楚为什么不这样做,因为我使用malloc在堆上分配它,因此对象应该在创建它的函数之外持久存在。

在下面的代码示例中,我正在寻找输出:

a = 3
a = 5

但我得到

a = 3
a = 3

即使是正确方向的一些指针也会有用!谢谢!

萨姆

备注

  • 如果可能的话,我想保持功能原型相同。

示例代码

#include <stdio.h>
#include <stdlib.h>

void really(int *a) {
    /* Allocate pointer to new int, set it to 5, and
    then set the pointer passed in equal to the new pointer */
    int *b = malloc(sizeof(int));
    *b = 5;

    a = b;
}

void change(int *a) {
    /* We don't actually change the object in this function;
    we are instead passing it to a different function to change */
    really(a);
}

int main() {
    int a = 3;
    printf("a = %d\n", a);
    change(&a);
    printf("a = %d\n", a);

    return 0;
}

2 个答案:

答案 0 :(得分:6)

C仅支持pass by value。当您将指针传递给函数时,指针的值(即它指向的地址)将被复制到function-parameter,一个新变量。

在函数really()中,您已用a指向的地址覆盖新指针b存储的地址。所以,这不会反映在main()中。但是,如果您取消引用a并为其指定了新值5,则amain()的值也会发生变化。

答案 1 :(得分:1)

你应该改变它的值,而不是它的指针。

更改(really()

a = b; // after this, a and b will both pointer to b's value

*a = *b; // change *a's value equal to *b's value