[英]Two different pointers pointing to the same address in C
我在這段代碼中遇到了這個非常奇怪的事情。
#include <stdio.h>
int main()
{
float d = 12.432;
float *pd = &d;
printf("Value of d is %f\n", *pd);
printf("Address of d is %p\n", pd);
printf("Address of d+1 is %p\n", (pd + 1));
printf("Value at d+1 is %f\n", *(pd + 1));
int c = 1;
int *yh = &c;
printf("Value of c is %d\n", *yh);
printf("Address of c is %p\n", yh);
printf("Address of c+1 is %p\n", (yh + 1));
printf("Value at c+1 is %d\n", *(yh + 1));
return 0;
}
當我在我的機器上運行這個片段時, d+1
和c
的地址是相同的。當我在 repl.it 或一些在線編譯器上運行時,我得到的地址應該不同。 問題是什么?
注意:C 標准不要求指針與 memory 地址直接相關。 然而,這是大多數現代系統的工作方式。 這個答案假設這樣一個系統
在我的機器中,d+1 和 c 的地址是相同的
我假設您的意思是:(d 的地址)+1 和 c 的地址是相同的。
這沒有什么奇怪的。
當pd + 1
等於yh
時,它僅僅意味着 integer c
被放置在 memory 中,就在浮動d
之后。
+---------+ <------- pd
| d |
+---------+ <------- pd+1 and also yh
| c |
+---------+ <------- yh+1
在另一個系統上,它可能是:
+---------+ <------- pd
| d |
+---------+ <------- pd+1
| unused |
+---------+
| unused |
+---------+
| unused |
+---------+ <------- yh
| c |
+---------+ <------- yh+1
在這種情況下pd+1
與yh
不同
...我得到不同的地址,因為它應該給出
這兩種情況都是合法的。 一個系統可以處理第一種情況,而另一個系統可以處理第二種情況。 所以不,它“應該給出”不同的地址是不正確的。
順便提一句:
雖然pd+1
是合法的,但像*(pd+1)
那樣取消引用它是非法的,因為那里沒有浮點數。 所以刪除行printf("Value at d+1 is %f\n", *(pd + 1));
這是非法的,也與問題無關。
這同樣適用於: printf("Value at c+1 is %d\n", *(yh + 1));
float是一個大小為 4 個字節的類型。
當您執行指針運算時,您會計算從原始地址偏移類型大小的數倍的地址。
即pd+1指向變量 d 后一個浮點數的地址。
通常,您的編譯器可能會依次將所有聲明的變量依次放入 memory:d、pd、c 和 yh,因為它們是按順序聲明的; 但不能保證,它可能會選擇不這樣做。
如果您的編譯器選擇將變量 d、變量 c 放置在 memory 中的兩個連續 32 位空間中,那么通常以下斷言將成立:
(pd+1) == &c
這似乎是你的情況。 沒有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.