2015-03-02 181 views
0

我发现如果你将一个指针地址赋值给FUNCTION中另一个指针的地址,它不会改变主函数中的in值,但是通过在main中做同样的事情,它会更改。那么这是什么原因呢?在函数中引用另一个指针的C指针

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 
} 
+1

因为您通过复制传递指针,然后更改指针的副本。 – 2015-03-02 21:57:29

+0

顺便说一句,你永远不会调用函数。这是一个复制错误? – Barmar 2015-03-02 21:58:31

回答

1

在此功能

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

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

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

您的功能:

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

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

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

所以它应该是:

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

func(&a,&b),你会重现您通过b = amain做什么。

+0

这里没有无符号整数 – 2015-03-02 22:15:32

+0

@MattMcNabb - 指针是无符号整数。 – dtech 2015-03-02 22:15:55

+1

不,它们是指针 – 2015-03-02 22:18:48