看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《iamyu58 (我是誰)》之銘言: : 我想問一個指標的問題 : 下面是我打的程式碼(我是新手 請見諒) : #include<stdio.h> : int main() : { : int *ptr=0; : printf("ptr:%d\n",*ptr); : printf("ptr+1:%d\n",(*ptr)+1); : printf("ptr+2:%d\n",(*ptr)+2); : return 0; : } : 為什麼執行結果會有錯? : 我原本預期的是 : ptr:0 : ptr+1:1 : ptr+2:2 : 請大家幫我解惑 謝謝 *ptr 是提取以 ptr 所指向之位址所存的值 但是 int *ptr = 0; 因此 ptr 並沒有指向任何東西 如果想要知道此時 ptr 所指向何處 應該使用 printf 的 pointer format : %p printf("ptr: %p\n", ptr); // 注意此處是傳 ptr 本身 printf("ptr+1: %p\n", ptr+1); printf("ptr+2: %p\n", ptr+2); 以此類推 -- 有時候,遺忘,是令人快樂的。什麼時候?當然是有人傷了你的心的時候。  存心傷你的那個人,固然是故意和你過不去,但是被傷了心而耿耿於懷的你  ,卻是和自己過不去了。所以,記性不好的人,通常會是比較快樂的人,也  是比較不容易被擊倒的人。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.50
VictorTom:int *ptr = 0; //ptr應該是就指向0這個位址吧....@_@" 11/16 00:35
holymars:根據語言的規範 當你把integral constant expression 11/16 00:51
holymars:with the value 0 assign給一個pointer,就會是一個null 11/16 00:51
holymars:pointer(不指向任何東西的pointer) 11/16 00:51
holymars:要注意的是 這和「null pointer的context必定是所有的 11/16 00:52
holymars:bit都等於零」是兩件事....這聽起來有點複雜 11/16 00:53
holymars:簡單的說 就算某些系統上以non-zero value來代表null 11/16 00:53
holymars:pointer(這是有可能發生的) 但是根據語言規範,當你把 11/16 00:53
holymars:一個其值為0的constant expression給一個pointer的時侯 11/16 00:54
holymars:即使該系統上的null pointer不是以零表示,編譯器還是應 11/16 00:54
holymars:該把那個pointer設為null pointer,因為這是語言規範 11/16 00:54
holymars:以上說的都是C語言 11/16 00:55
VictorTom:原來如此, 小弟受教了<(_ _)> 看起來這與實務無關, 而是 11/16 01:13
VictorTom:定義層級的東西了....@_@" 11/16 01:14
holymars:只有一個陷阱 是你把其值為0的變數assign給pointer,或 11/16 01:19
holymars:強制轉型成pointer時,它有可能不被當成null pointer 11/16 01:19
holymars:不過..基本上所有主流系統null pointer都是0啦XD 11/16 01:19
ledia:看板長智慧... 我只知道語意上沒指向東西, 不知道原來 null 11/16 10:04
ledia:pointer 也可能有不同的值.... m(_ _)m 11/16 10:04
VictorTom:小弟我本來還不知道語意上是沒指向東西呢....Orz 11/16 10:28
VictorTom:因為dereference下去看起來都是Mem Access Violation XD 11/16 10:29