C中的指针和地址

时间:2017-06-07 15:23:27

标签: c pointers

我写了一个C程序。我有两个指针*a*b。现在,我强加*a = 20*b = 10。之后我在子程序中强制a = b但值似乎没有改变。我希望*a = 10*b = 10。请帮我找到解决方案。谢谢。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void Copy(int *a1, int *a2)
{
    a1 = a2;
}


void Test()
{
    // a = 20
    int *a = (int *)malloc(sizeof(int));
    *a = 20;

    // b = 10
    int *b = (int *)malloc(sizeof(int));
    *b = 10;

    Copy(a, b); // a = b
    printf("\na = %d", *a);
    printf("\nb = %d", *b);
}

int main(int argc, char *argv[]){
    Test();
    fflush(stdin);
    printf("\nPress any key to continue");
    getchar();
    return 0;
}

2 个答案:

答案 0 :(得分:2)

如果您要分配值,以便在Copy *a == *b召唤之后,您必须按如下方式更改您的功能:

void Copy(int *a1, int *a2)
{
    *a1 = *a2;
}

如果你想分配指针,那么在调用Copy a==b之后,你必须传递一个指向指针的指针:

void Copy(int **a1, int **a2)
{
    *a1 = *a2;
}

void Test() {
    ...
    Copy (&a, &b);
    ...
}

请注意,a==b也表示*a == *b

答案 1 :(得分:1)

函数参数按值传递。因此,在函数Copy内部,您正在修改指针的副本,而不是Test函数中的原始指针。因此,当您离开Copy函数时,外部指针不会被修改。

更改Copy以接收int **,这样您就可以更改指针值内部

void Copy(int **a1, int **a2)
{
    *a1 = *a2;
}

以这种方式调用函数:

void Test() {
    ...
    Copy (&a, &b);
    ...
}