[教學] Pointer II
這次來講 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;
cout<<s<<endl;
cout<<&s<<endl;
cout<<&s[0]<<endl;
//以上三行是一樣的!! 不要問我為什麼= =
好 我又懶得打了
大家期中考加油
我要去吃午餐了
--
╭═══╤═══╮ ╰═╮ ╭═╯
│ │ │╭═和平,土地,麵包═╮ │ │
│ ╭═╧╧╮╤═╤═╮═╤═╤╧╮ │ │
│ │ ││ │ │ │ │ │ ╰═╤═╯
│ │ ││ │ │ │ │ │ │
╰╧╯╰═══╯╰ ╰ ╰ ╰ ╰ ╰ ─╯
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.239.191
※ 編輯: TommyKSHS 來自: 140.112.239.191 (11/11 11:40)
推
11/11 11:53, , 1F
11/11 11:53, 1F
推
11/11 12:03, , 2F
11/11 12:03, 2F
推
11/11 12:16, , 3F
11/11 12:16, 3F
推
11/11 12:19, , 4F
11/11 12:19, 4F
推
11/11 12:20, , 5F
11/11 12:20, 5F
推
11/11 12:37, , 6F
11/11 12:37, 6F
→
11/11 12:37, , 7F
11/11 12:37, 7F
→
11/11 14:06, , 8F
11/11 14:06, 8F
推
11/11 14:30, , 9F
11/11 14:30, 9F
→
11/11 14:51, , 10F
11/11 14:51, 10F
推
11/11 14:53, , 11F
11/11 14:53, 11F
推
11/11 17:01, , 12F
11/11 17:01, 12F
推
11/11 18:34, , 13F
11/11 18:34, 13F
推
11/11 19:10, , 14F
11/11 19:10, 14F
推
11/11 19:43, , 15F
11/11 19:43, 15F
推
11/11 20:11, , 16F
11/11 20:11, 16F
推
11/11 21:20, , 17F
11/11 21:20, 17F
→
11/11 21:20, , 18F
11/11 21:20, 18F
→
11/11 21:30, , 19F
11/11 21:30, 19F
推
11/11 22:09, , 20F
11/11 22:09, 20F
推
11/11 22:39, , 21F
11/11 22:39, 21F
→
11/11 22:45, , 22F
11/11 22:45, 22F
推
11/11 22:55, , 23F
11/11 22:55, 23F
→
11/11 23:33, , 24F
11/11 23:33, 24F
※ 編輯: TommyKSHS 來自: 140.112.239.191 (11/11 23:34)
推
11/12 04:57, , 25F
11/12 04:57, 25F
推
11/12 09:56, , 26F
11/12 09:56, 26F
→
11/12 12:11, , 27F
11/12 12:11, 27F
推
11/14 23:39, , 28F
11/14 23:39, 28F
推
11/15 10:51, , 29F
11/15 10:51, 29F
推
11/17 12:16, , 30F
11/17 12:16, 30F
推
11/18 07:16, , 31F
11/18 07:16, 31F
推
12/01 17:18, , 32F
12/01 17:18, 32F