Re: [問題] 指標問題

看板C_and_CPP (C/C++)作者 (石斛蘭)時間14年前 (2010/01/29 23:36), 編輯推噓7(702)
留言9則, 7人參與, 最新討論串6/13 (看更多)
※ 引述《QQ29 (我愛阿蓉)》之銘言: : 以下是我做的小小測試 不過我故意不寫成繼承 : class AA{ : public: : AA():x(0),a(0){} : int x; : int a; : void FOO(){cout<<"A"<<endl;} : }; : class BB{ : public: : BB():y(0.0),b(0.0){} : double y; : double b; : int z; : void FOO(){cout<<"B"<<endl;} : }; : int main() : { : BB *pb=new BB; pb 指向 BB 物件的第一個位置 ↙ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ / \ / \ / y b z : AA* p=(AA*)pb; 把pb這個位置當成是AA物件的位置丟給p 所以 p 也指向 BB 物件的第一個位置 (在p的眼中他是AA) pb, p ↙ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ / \ / \ / y b z : p->x=5; p->x 是第一個位置 所以應該是 y 的前四個 byte pb, p ↙ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | int 5 | | | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ / \ / \ / y b z : char *ptr=(char*)&pb->y; y 是BB物件的第一個位置 所以等同於把 pb 所指的位置傳給 ptr (只是type不同 不過沒查 反正都硬轉了) pb, p, ptr ↙ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | int 5 | | | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ / \ / \ / y b z : ptr-=4; 假如沒有 : cout<<(int)*ptr; 把 ptr 所指的位置當成 int 輸出 所以不意外會是 5 pb, p, ptr ↙ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | int 5 | | | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ / \ / \ / y b z : return 0; : } 那如果 ptr -= 4 的話呢? ptr pb, p ↙ ↙ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | int 5 | | | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ / \ / \ / y b z 就跑到前面了... : 如果ptr不-4 印的出5 : 可是我不懂為啥可以印 -- 人家可不是為了你才這樣做的哦! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.198.35.85 ※ 編輯: dendrobium 來自: 60.198.35.85 (01/29 23:39)

01/29 23:42, , 1F
s/查/差 :p
01/29 23:42, 1F

01/29 23:49, , 2F
推認真
01/29 23:49, 2F

01/30 13:11, , 3F
超讚! 感謝認真圖文教學!
01/30 13:11, 3F

01/30 13:22, , 4F
推圖:)
01/30 13:22, 4F

01/30 14:00, , 5F
推推推....精美圖文講解
01/30 14:00, 5F

01/31 01:22, , 6F
可是c++ primer裡面說 變數宣告和排列不一定相同
01/31 01:22, 6F

01/31 02:31, , 7F
回樓上, 宣告跟定義是不同東西喔~
01/31 02:31, 7F

01/31 03:39, , 8F
用來解說的話很清楚呀
01/31 03:39, 8F

02/01 04:27, , 9F
02/01 04:27, 9F
文章代碼(AID): #1BOm2F3m (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
13
58
以下文章回應了本文
完整討論串 (本文為第 6 之 13 篇):
1
1
4
13
5
21
13
58
5
39
1
28
1
9
文章代碼(AID): #1BOm2F3m (C_and_CPP)