[英]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
在foo
, a
和b
是單獨的局部變量。 將它們設置為具有相同的值對先前的值沒有影響 - foo
的最后一行當前什么都不做。
內foo
, a
是初始的指針相同的位置a
在main
,和b
是一個指針,指向同一位置b
在主。 最后一行只是使價值a
中foo
同b
-即指向同一位置b
主。 所以如果你添加一行
*a = 7;
在foo
結束時,你會看到輸出“5,7”。
(順便說一句,如果你在main
和foo
使用了不同的變量名,你的代碼肯定會更容易討論。)
如果你試圖讓a
和b
在main
“別名”中相互對話,你就不會成功。 它們是堆棧上的獨立局部變量,並將保持不變。 無論你做什么,你都不能讓堆棧“縮小”為別名。
我不確定你要追求的是什么...如果要讓a
和b
包含相同的值,請嘗試*a = *b
。
因為當調用foo
時,指針的值被復制到函數中。 如果要更改指針本身的值,則需要將指針傳遞給指向函數的指針。
當程序從堆棧上的函數數據返回時,a和b是函數foo的本地函數(它們在堆棧中)。 將b分配給a時,只修改堆棧中的內存地址,而不是它們的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.