省 memory 同快既問題...
faiwaic 發表於 2013-4-3 23:15
POINTER 要表達O既野跟本係同intrinsic value 唔同一個CLASS.同省MEMORY 或者速度完全冇關.

TOP

本帖最後由 LoneGumMan 於 2013-4-4 01:47 編輯
請問 C++ 既 pointer 係 point 左去邊 ? 係想去另一個 function / address  定其他地方 ?
thanks ...
peterchu1 發表於 2013-4-3 17:37
其實冇話"point 左去邊". 首先你要理解O既係乜野叫做 variable.

(以下例子暫時放開 stack vs heap allocation 唔理住)

用一個傳統O既例子. 你可以想像你個PROGRAM O既MEMORY SPACE 係一堆locker , 好似公眾泳池果D. 每當你 declare 一個 variable, 你可以想像你要用一個或以上O既locker去放野(視乎你要放幾多, char / bool 最細, 一格就得, short 大D, 兩格, int 四格,etc). 假設locker 係 2D grid, 好似EXCEL 咁可以 A11, B23 咁去reference, 咁個 char 就可能係放響 A13, 個 int variable 可能係 D11,D12,D13,D14

char c = 'x'; // c o既address 係 A13
int i = 12345; // i o既address 係 D11 - 14

一個pointer variable 就係一個儲住個 Address o既 variable.

char* cp = &c;  // cp = A13
int* ip = &i; // ip = D11

當你用一個 int pointer o既時候, compiler 知道 int 係 4 格咁大 (佢知道所有 type O既 exact size), 所以當你 de-reference 一個 int pointer o既時候, 佢就會識得讀番 D11 - 14 俾你;

char c2 = *cp;  // c2 = 'x'
int i2 = *ip;  // i2 = 12345

有師兄提到pass-by-value / pass-by-reference, 順帶解釋埋. 響 C / C++ 裏面, 當你 call function o既時候, parameter default 係pass-by-value o既, 即係compiler 會gen code 幫你做一個copy俾function 用. 大部份時候咁樣都OK, 但係如果你想個function幫你改個 variable o既value 又點呢? 唔WORK, 因為佢可以改到o既只係一個COPY.

簡單例子 (少少syntax錯,唔理):
  1. void func (int yy) {
  2.    yy = yy + 1;
  3. }
  4. ....
  5. int main () {
  6.     int yy = 10;
  7.     func ( yy );
  8.     cout << "yy = " << yy << endl;
  9. }
複製代碼
當你最後 print yy o既時候, 出黎仍然係 10, 因為function 改果個係個 "copy of caller's yy".

要人地改到你O既value, 最簡單就係話俾人知個locker (memory location!) 等人地直接寫:
  1. void func (int* yy) {
  2.    *yy = *yy + 1;
  3. }
  4. ....
  5. int main () {
  6.     int yy = 10;
  7.     func ( &yy );
  8.     cout << "yy = " << yy << endl;
  9. }
複製代碼
今次, yy 係11, 因為人地知道真正O既memory address, 可以de-reference去改.

以上O既寫法係 C. C++ 可以有一個靚仔D O既寫法, reference
  1. void func (int& xx) {
  2.    xx = xx + 1;
  3. }
  4. ....
  5. int main () {
  6.     int yy = 10;
  7.     func ( yy );
  8.     cout << "yy = " << yy << endl;
  9. }
複製代碼
今次冇晒D 星星, 因為 xx 係一個"reference to int", 可以諗成為一個 "代號" (我唔知中文書叫佢做乜野 :p) compiler 知道 "xx" 其實即係 caller o既 yy;  如果你改 xx 即係直接改 yy

仲有其他 const reference 之類O既野, 你慢慢睇下會明

TOP

其實冇話"point 左去邊". 首先你要理解O既係乜野叫做 variable.

(以下例子暫時放開 stack vs heap allocat ...
LoneGumMan 發表於 2013-4-4 01:44

解釋得好好!
其實pointer最難係以下幾個問題:
1)pointer同array關係
2)pointer同String關係
3)pointer同"動態記憶體配置"的關係

TOP

其實pointer 搞到咁難用咁樣
點解唔做返要自己copy 份新出黎,而default 用左pass by value
有無人知當初點解要咁樣設計?

TOP

Binary Tree 既話, Java 同 VB 冇 pointer 都做到...
係煩少少
faiwaic 發表於 4/4/2013 12:19 AM



    係唔洗explicitly 咁declare ,所有用new operator做ge object都係pointer黎


各兄弟,唔好再話Java, JS, AS無pointer唔該

TOP

其實pointer 搞到咁難用咁樣
點解唔做返要自己copy 份新出黎,而default 用左pass by value
有無人知當初 ...
DarkHero 發表於 4/4/2013 12:51 PM



    你咁樣樣就大鑊啦,個個object唔同size,下下都copy個program會行好耐,又要用好多好多位


stack overflow你就死得

TOP

你咁樣樣就大鑊啦,個個object唔同size,下下都copy個program會行好耐,又要用好多好多位


stack o ...
Jackass_TMxCK 發表於 2013-4-4 16:47

我咪話如果有需要咪自己copy 囉

TOP

我咪話如果有需要咪自己copy 囉
DarkHero 發表於 4/4/2013 04:56 PM



    咩叫有需要要自己copy,行親function都會要用各式各樣ge object,下下都copy?我係講緊呢個問題

如果係自己個function以內用ge object,你鐘意點無所謂。最大問題係你唔係咩都寫曬係同一個function度,d野要pass黎pass去

TOP

我咪話如果有需要咪自己copy 囉
DarkHero 發表於 2013-4-4 16:56


Java咪已經係咁

TOP

Java咪已經係咁
KinChungE 發表於 2013-4-4 16:59



    但係好奇一問, 點解 Java 仲係慢過 C++?

TOP