精華區beta NTUEE113HW 關於我們 聯絡資訊
這次來講 pointer 和 array 的關係 首先有一個奇妙的故事 array 某種程度上就是 pointer 但並不是完完全全地是 pointer 為什麼我會這樣說呢? 因為在 pointer 和 array 之間有某種奇妙的關連 array 的名字就是 pointer 舉個例子吧 int s[20]; 如果我們要問 s[0] 的 address 是多少? 很簡單,就是 &s[0] 不過還有另一種寫法,就是 s 。對,你沒看錯,就是 s 所以你可以 cout<<s 和 cout<<&s[0] 看看 就會發現結果是一樣的。 然後補一點 array 的觀念 當你宣告了一個 array ,ex: int s[20]; 就代表你 allocate 了連續的一段 memory 。 然後 每一個陣列的元素所佔的大小是 4 bytes ( 因為 int 佔了 4 bytes ) 那 指標的運算是怎麼一回事? 例如 int s[5] = {10, 20, 30, 40, 50}; int *p = s; // 這行也可以寫成 int *p = &s[0]; cout<<*p; *p 大家應該馬上看得出來就是 s[0], p 就是 &s[0] 或 s 上面也有說過了 那 … *(p+1) 是什麼呢? XD 答案是 p[1] 也就是 20 原因就在剛剛說的 array 在 memory 中是一段連續的空間 (空間這個詞有點不太好 = =) 所以這裡正式的講一下指標的加法 (減法) p 是一個 int 的 pointer p+i 代表的是一個 address , 這個 address 剛好是 p 的 address 加上 4*i 這裡的 4 是 int 的 4 bytes, 如果你的 p 是 char* 那就變成 1 而不是 4 於是如果 p 指向的是一個 array , int s[5]; p 的 address 加了 4*i 之後 會剛好跑到 s[i] 的 address 也就是 &s[i] 以上有點難懂= = 所以 for(int i=0;i<5;i++) cout<<s[i]<<endl; 可以寫成 for(int i=0;i<5;i++) cout<<*(p+i)<<endl; 然後 p 當然也可以指向 array 中任一個元素 例如 : int s[5],*p; p = &s[2]; *p 就是 s[2], *(p+1) 就是 s[3] , *(p-1) 就是 s[1] 所以 要印出 整個 s 陣列 可以寫成 for(int i=-2;i<3;i++) cout<<*(p+i)<<endl; 科科 然後 奧妙的來了 剛剛說過某種程度上 pointer 和 array 是一樣的 所以還有另一種寫法是這樣的 *p 其實 就是 p[0] *(p+i) 就是 p[i] 所以上面也可以寫成 for(int i=-2;i<3;i++) cout<<p[i]<<endl; 最後,有一個超ㄉㄧㄠˋ詭的東西 就是像這樣 int s[20],*p; p = s; p = &s; p = &s[0]; //以上三行是一樣的!! 不要問我為什麼= = 好 我又懶得打了 大家期中考加油 我要去吃午餐了 -- ╭═══╤═══╮ ╰═╮ ╭═╯ │ │ │╭═和平,土地,麵包═╮ │ │ │ ╭═╧╧╮╤═╤═╮═╤═╤╧╮ │ │ │ │ ││ │ │ │ │ │ ╰═╤═╯ │ │ ││ │ │ │ │ │ │ ╰╧╯╰═══╯╰ ╰ ╰ ╰ ╰ ╰ ─╯ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.239.191 ※ 編輯: TommyKSHS 來自: 140.112.239.191 (11/11 11:40)
e2167471:看來不收精華區不行了 11/11 11:53