[英]What happens if I assign to an int pointer a float variable address and vice-versa?
我想知道如果我給一個int
指針一個float
變量地址會發生什么,反之亦然,所以我嘗試了它,但無法完全理解發生了什么,所以如果有人能解釋我會很感激。
int n = 5;
float f = 1.21;
float *pf = &n;
int *pn = &f;
printf("%p %p\n", pn, pf);
printf("%p %p\n", &f, &n);
printf("%d %f \n", *pn, *pf);
printf("%f %d \n", n, f);
printf("%d %f \n", n, f);
輸出:
0xffffcba8 0xffffcbac 0xffffcba8 0xffffcbac 1067114824 0.000000 0.000000 0 5 1.210000
您的代碼中有許多未定義行為的實例:
int n = 5;
: 好的float f = 1.21;
: 好的float *pf = &n;
用指向不同類型的指針的值初始化一個指針。 C 標准不保證這會做什么,也不保證當你取消引用這個指針時會發生什么。 使用-Wall -W
,您肯定會收到警告,您可以通過-Wall -W
使其靜音: float *pf = (float *)&n;
,但結果是相同的,取消引用指針具有未定義的行為。int *pn = &f;
和上面一樣。 printf("%p %p\\n", pn, pf);
-> 你應該將指針轉換為(void *)
因為%p
需要一個void *
作為參數。 在一些罕見的系統(舊的 Cray 系統 IIRC)上,指向int
、 float
和void
指針可能有不同的表示,導致對printf
調用以意想不到的方式運行。 改用這個:
printf("%p %p\\n", (void *)pn, (void *)pf);
printf("%p %p\\n", &f, &n);
-> 同樣的問題。 改用這個:
printf("%p %p\\n", (void *)&f, (void *)&n);
兩個表達式的輸出是正確的並且相同,因為您的系統是常規的,但 C 標准不保證它。
printf("%d %f \\n", *pn, *pf);
這是正確的,但取消引用指針具有未定義的行為。printf("%f %d \\n", n, f);
傳遞與預期類型不同的類型值具有未定義的行為。 你得到的輸出是不正確的。printf("%d %f \\n", n, f);
這個是正確的,輸出是5 1.210000
正如預期的那樣。Chqrlie的回答比我的好得多。 請重新接受他的回答。
你不應該濫用指針和對象——即使不是出於好奇的原因。 1., 2., 5. printf
命令的結果是正確的,而3., 4. printf
命令的結果是Undefined Behavior的產物,沒有人可以解釋。
有關未定義行為的更多信息: 未定義、未指定和實現定義的行為
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.