作者ledia (下班後才下棋)
看板C_and_CPP
標題Re: [問題] 指標問題
時間Sun Nov 15 23:17:55 2009
※ 引述《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
1F:推 VictorTom:int *ptr = 0; //ptr應該是就指向0這個位址吧....@_@" 11/16 00:35
2F:推 holymars:根據語言的規範 當你把integral constant expression 11/16 00:51
3F:→ holymars:with the value 0 assign給一個pointer,就會是一個null 11/16 00:51
4F:→ holymars:pointer(不指向任何東西的pointer) 11/16 00:51
5F:→ holymars:要注意的是 這和「null pointer的context必定是所有的 11/16 00:52
6F:→ holymars:bit都等於零」是兩件事....這聽起來有點複雜 11/16 00:53
7F:→ holymars:簡單的說 就算某些系統上以non-zero value來代表null 11/16 00:53
8F:→ holymars:pointer(這是有可能發生的) 但是根據語言規範,當你把 11/16 00:53
9F:→ holymars:一個其值為0的constant expression給一個pointer的時侯 11/16 00:54
10F:→ holymars:即使該系統上的null pointer不是以零表示,編譯器還是應 11/16 00:54
11F:→ holymars:該把那個pointer設為null pointer,因為這是語言規範 11/16 00:54
12F:→ holymars:以上說的都是C語言 11/16 00:55
13F:推 VictorTom:原來如此, 小弟受教了<(_ _)> 看起來這與實務無關, 而是 11/16 01:13
14F:→ VictorTom:定義層級的東西了....@_@" 11/16 01:14
15F:推 holymars:只有一個陷阱 是你把其值為0的變數assign給pointer,或 11/16 01:19
16F:→ holymars:強制轉型成pointer時,它有可能不被當成null pointer 11/16 01:19
17F:→ holymars:不過..基本上所有主流系統null pointer都是0啦XD 11/16 01:19
18F:→ ledia:看板長智慧... 我只知道語意上沒指向東西, 不知道原來 null 11/16 10:04
19F:→ ledia:pointer 也可能有不同的值.... m(_ _)m 11/16 10:04
20F:推 VictorTom:小弟我本來還不知道語意上是沒指向東西呢....Orz 11/16 10:28
21F:→ VictorTom:因為dereference下去看起來都是Mem Access Violation XD 11/16 10:29