推 dendrobium:2. FOO() 被轉成 FOO(AA* this) 了吧 所以還是可以call 01/29 22:51
推 dendrobium:ptr-=4; // ptr是指標捏... 01/29 23:01
→ QQ29:恩對阿 我是想要他移動4byte 01/29 23:02
→ saxontai:指標 -4 不是移動 4 bytes 哦!去複習指標算數運算吧 01/29 23:06
推 dendrobium:3.cout << (int) *(int*)&(pb->y) ; 滿亂來的... 01/29 23:10
→ loveme00835:他轉成char*剛好4 bytes 01/29 23:11
推 dendrobium:1. 因為pb,p,ptr 這三個的位置是一樣的... 01/29 23:16
→ QQ29:為啥不是4byte.. char難道不是1b嗎... 01/29 23:17
→ dendrobium: (int)*ptr 的意思就是叫電腦把 *ptr 當 int 看 01/29 23:17
→ dendrobium:所以不管他是big還是little都一樣... 01/29 23:18
→ loveme00835:剛測試過&p->x 跟 &pb->y 是一樣的所以ptr不用移 01/29 23:20
→ loveme00835:差別只有型態 01/29 23:21
→ QQ29:d大問一下 你3. 為啥不能單純用(int)轉就好? 01/29 23:35
→ QQ29:而且就算我shift 4 byte 應該可以印出五吧? 01/29 23:37
推 dendrobium:你是想問 為什麼不能用 (int) pb->y 嗎? 01/29 23:38
→ QQ29:對~ 01/29 23:39
→ QQ29:FOO(AA* this) 不太懂意思耶 call FOO只是看指標型別嗎? 01/29 23:40
推 dendrobium:(int) pb->y 只是把 pb->y 的值(double) 轉成int 01/29 23:42
→ dendrobium:而不是把那塊記憶體當成 int 來讀 01/29 23:43
→ QQ29:轉不太過來= = 這樣和你先用int*指過去 再取值 再轉型 印出 01/29 23:44
→ QQ29:有什麼不同 如果你的方法最後(int)不寫 會不能印嗎@@ 01/29 23:44
→ dendrobium:哈哈 最左邊的(int) 可以不用寫XD 01/29 23:46
→ QQ29:觀念我好像有點bug 不過我想問 stack不是 大->小嗎 01/29 23:48
→ QQ29:=5 這動作 為啥不是在 最後4byte 賦值 01/29 23:49
推 dendrobium:我畫的圖 左邊是小 右邊是大 :) 01/29 23:49
→ QQ29:我以我才會想-4 01/29 23:49
→ dendrobium:以指標所指的位置為準 指哪就丟哪囉 01/29 23:50
→ QQ29:....我困惑了 cout<<&pb->y<<endl<<&pb->b<<endl; 為啥是 01/30 00:01
→ QQ29:小,大 我以為是因為在heap 把pb改成物件 也是印出 小,大 01/30 00:01
→ QQ29:為啥它配置的 記憶體是小->大呢 不是應該大->小嗎 01/30 00:02
推 dendrobium:物件或是陣列之類的放在stack或heap併不會換順序呀 01/30 00:03
→ dendrobium:會換的話...那 *(ptr+5) 在兩邊的意思不就不同了XD 01/30 00:04
→ QQ29:我隨便宣告個 int a再int b 印 =>大,小 呀 01/30 00:04
推 loveme00835:區域變數是存在stack裡, 所以才是大到小 01/30 00:05
→ loveme00835:heap是從小配置到大 01/30 00:05
→ QQ29:那這不算區域嗎~ 01/30 00:05
→ loveme00835:不過物件本身的layout會從小到大就是了 01/30 00:07
→ loveme00835:這關係到要從某位置offset取資料成員, 跟d大講的一樣 01/30 00:08
→ QQ29:那可以呼叫到foo是因為指標是AA型態嗎 01/30 00:18
推 dendrobium:你可以把 void AA::FOO() 想成是 void FOO(AA* this) 01/30 00:23
→ dendrobium:而 p->FOO() 被轉成 FOO(p) 01/30 00:24
→ QQ29:D大這種 想法是有書上這樣說的嗎 我都沒有這種觀念耶 01/30 00:26
→ QQ29:我現在正在想您3. 的說法 到底單純用(int) 有什麼不一樣... 01/30 00:27
→ QQ29:有點轉不過來 01/30 00:27
→ QQ29:為啥我這樣印出來是0.... 01/30 00:28
推 dendrobium: *(int*)&(pb->y) /* 抓前四個byte當 int */ 01/30 00:30
→ QQ29:可以想成 pb->y 以double來看可能是0.幾 我把他的值用int 看 01/30 00:30
→ QQ29:就變0了? 01/30 00:30
→ dendrobium:Yeah! 01/30 00:31
→ QQ29:那您說的function這種看法 是有什麼根據嗎!!? 以前沒想那麼多 01/30 00:32
→ dendrobium:應該說是被round掉了吧 忘記是四捨五入還是 floor了... 01/30 00:32
推 dendrobium:好像是以前上課聽到的...? 01/30 00:35
→ dendrobium:忘記好像是compiler是這樣將C++轉成C 然後當成C處理 01/30 00:36
→ dendrobium:不過遇到 virtual function 會比較複雜 01/30 00:40
推 loveme00835:每個class都會存一個成員函數表, 裡面是每個函數的起 01/30 00:41
→ loveme00835:始位置, 當呼叫函數時編譯器就去查表, 這應該書上的 01/30 00:42
→ loveme00835:多型章節會講到, 因為你的指標是AA*, 所以找class AA 01/30 00:43
→ loveme00835:的表 01/30 00:44