C指针 - 指向相同的地址

时间:2010-09-28 17:25:32

标签: c pointers

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

void foo(int *a, int *b);

void foo(int *a, int *b) {
    *a = 5;
    *b = 6;
    a = b;
}

int main(void) {
    int a, b;
    foo(&a, &b);
    printf("%d, %d", a, b);
    return 0;
}

为什么a = b(foo)不起作用? printf输出“5,6” 谢谢。

7 个答案:

答案 0 :(得分:10)

确实有效;它只是没有做你认为它做的事。

foo()中,a = b将指针a更改为指向b指向的任何内容。它对函数之外的任何东西都没有影响;它只会改变指针。

如果要将a指向的int的值更改为b指向的int的值,则需要使用*a = *b,类似于你已经在函数中进行分配的方式。

答案 1 :(得分:4)

foo()的调用以其局部变量指向相同的地址结束,存储在 b 中。此更改未反映在调用者main()中。

我喜欢实际执行此操作并使此更改永久化,然后您必须将指针传递给指向foo()的指针(以便您可以更改它们),而不是简单的值:

void foo(int **a, int **b) {
    **a = 5;
    **b = 6;
    *a = *b;
}

我刚刚发现你的代码与修改不兼容,无论如何,因为你不能改变两个正常变量来指向彼此。您还必须以这种方式修改main()

int main(void) {
    int a, b;
    int * ptrA = &a;
    int * ptrB = &b;

    foo(&ptrA, &ptrB);
    printf("%d, %d (%d, %d)", *ptrA, *ptrB, a, b);
    return 0;
}

答案 2 :(得分:2)

使用伪内存映射

main()

    a      b
 --------------
|  5   |   6   | <- data
 --------------
 [1000]  [1004]  <- address

在函数foo()中,

    a        b      ( local to foo(), different from the a & b in main() )
 ----------------
|  1000  | 1004  | <- data
 ----------------
  [2000]   [2004]  <- address

所以,在foo()的范围内,

*a = 5;   // store 5 in int variable a
*b = 6;   // store 6 in int variable b
 a = b;   // copies contents of pointer variable b to a

所以foo()范围内的最终地图是:

    a        b
 ----------------
|  1004  | 1004  | <- data
 ----------------
  [2000]   [2004]  <- address

答案 3 :(得分:1)

foo中,ab是单独的局部变量。将它们设置为具有相同的值对先前的值没有影响 - foo的最后一行目前基本上没有任何作用。

foo内,a 最初是指向与amain相同位置的指针,而b是指向与main中b相同位置的指针。最后一行只是使afoo的值与b相同 - 即指向与main中b相同位置的指针。所以如果你添加一行

*a = 7;

foo的末尾,然后你会看到输出“5,7”。

(顺便说一句,如果您在mainfoo中使用了不同的变量名,那么您的代码肯定会更容易讨论。)

如果你试图让ab内的main“别名”,那么你就不会成功。它们是堆栈上的独立局部变量,并将保持不变。无论你做什么,都无法使堆栈“缩小”为别名。

答案 4 :(得分:0)

我不确定你要追求的是什么...如果要让ab包含相同的值,请尝试*a = *b

答案 5 :(得分:0)

因为调用foo时,指针的值被复制到函数中。如果要更改指针本身的值,则需要将指针传递给指向函数的指针。

答案 6 :(得分:0)

a和b是函数foo的本地函数(它们在堆栈中),当程序从堆栈上的函数数据返回时丢失。将b分配给a时,只修改堆栈中的内存地址,而不是它们的值。