C指针引用函数中的另一个指针

时间:2015-03-02 21:55:40

标签: c pointers

我发现如果你将一个指针地址分配给一个FUNCTION中的另一个指针的地址,它就不会改变main中的in值, 然而,通过在main中做同样的事情,它会改变。那是什么原因呢?

void func(int *a, int *b){
     b = a;
 }


int main(){
   int i= 5, k =6, *a=&i, *b=&k;
   printf("%d %d\n",*a,*b);  //output 5 6
   b = a;
   printf("%d %d\n",*a,*b);  //output 5 5

   a=&i;
   b=&k;
   func(a,b);
   printf("%d %d\n",*a,*b);  //output 5 6
   printf("%d %d\n",*a,*b);  //output 5 6
}

2 个答案:

答案 0 :(得分:1)

在此功能中

void func(int *a, int *b){
     b = a;
 }

参数a和b是函数的局部变量。退出该功能后,它们将被销毁。该函数处理参数的副本。如果您希望函数本身更改原始参数,则必须将指针传递给它们。例如

void swap(int **a, int **b){
     int *tmp = *a;
     *a = *b;
     *b = tmp;
 }

答案 1 :(得分:0)

你的职能:

void func(int *a, int *b){
     b = a;
 }

没有做任何事情,它只需要两个代表内存地址的值作为参数,并将一个值分配给另一个,而不会产生任何外部影响。它只是将一个值写入另一个(可能甚至不是这样,因为编译器可能会检测到这是毫无意义并完全消除它),它不会对存储在这些地址的信息做任何事情。您需要将指针读取或写入其保存值的内存地址,但在当前形式中,函数不会将指针指定给另一个,而是将i的值赋给{{ 1}}。

如果你想要一个函数来改变它之外的参数,你应该通过引用传递,它在C中只是通过指针传递,所以你需要传递一个指向指针的指针,而不是指针 - 这将传递一个指针该指针的副本 - 相同的值,当作为指针指针传递时,将传递指针在内存中的地址,而不是它所持有的值。

所以它应该是:

k

void func(int **a, int **b){ *b = *a; } ,您将通过func(&a,&b)重现您在main中所做的工作。