簡體   English   中英

C指針 - 指向相同的地址

[英]C pointers - Point to the same address

#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”謝謝。

它確實有效; 它只是沒有做你認為它做的事情。

foo() a = b改變指針a指向任何b點。 它對函數之外的任何東西都沒有影響; 它只會改變指針。

如果要將a指向的int的值更改為與b指向的int的值相同,則需要使用*a = *b ,類似於已在函數中執行賦值的方式。

foo()的調用以其指向相同地址的局部變量結束,存儲在b中 此更改不會反映在調用方main()

我喜歡實際執行此操作並使此更改為pemanent,然后您必須將指針傳遞給指向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;
}

使用偽內存映射,

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

fooab是單獨的局部變量。 將它們設置為具有相同的值對先前的值沒有影響 - foo的最后一行當前什么都不做。

fooa初始的指針相同的位置amain ,和b是一個指針,指向同一位置b在主。 最后一行只是使價值afoob -即指向同一位置b主。 所以如果你添加一行

*a = 7;

foo結束時,你會看到輸出“5,7”。

(順便說一句,如果你在mainfoo使用了不同的變量名,你的代碼肯定會更容易討論。)

如果你試圖讓abmain “別名”中相互對話,你就不會成功。 它們是堆棧上的獨立局部變量,並將保持不變。 無論你做什么,你都不能讓堆棧“縮小”為別名。

我不確定你要追求的是什么...如果要讓ab包含相同的值,請嘗試*a = *b

因為當調用foo時,指針的值被復制到函數中。 如果要更改指針本身的值,則需要將指針傳遞給指向函數的指針。

當程序從堆棧上的函數數據返回時,a和b是函數foo的本地函數(它們在堆棧中)。 將b分配給a時,只修改堆棧中的內存地址,而不是它們的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM