推 e2167471:看來不收精華區不行了 11/11 11:53
這次來講 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)