[問題] 指標運算的型別轉換?

看板C_and_CPP作者 (被~~~切~~~八~~~段)時間12年前 (2012/03/29 10:30), 編輯推噓1(104)
留言5則, 2人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) No 問題(Question): 指標運算的型別轉換問題 餵入的資料(Input): int *a_ptr 預期的正確結果(Expected Output): return (struct s*)((char*)a_ptr - (int)&((struct s*)0)->a); 錯誤結果(Wrong Output):程式碼(Code):(請善用置底文網頁, 記得排版) 某 struct s, 內含 member a, struct s { ... int a; … }; 傳入 member a 的指標, 求傳回 struct s 的指標.. struct s* get_s_ptr(int *a_ptr) { return (struct s*)((char*)a_ptr - (int)&((struct s*)0)->a); } 補充說明(Supplement): 我想請問 a_ptr 為何要先轉換成 (char*) 才去減右邊? 其中右邊為了被減還特地轉換成 (int).. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 96.55.113.197

03/29 10:34, , 1F
指標加減運算的單位是資料的大小
03/29 10:34, 1F

03/29 10:35, , 2F
char *a = 0x0; a+= 1; => a = 0x1;
03/29 10:35, 2F

03/29 10:36, , 3F
int *a = 0x0; a+= 1; => a= 0+sizeof(int) = 0x4
03/29 10:36, 3F
感謝, 我試著解釋看看: 左邊是位址, 要轉換成 char *, 才能把加減時的單位轉換成 1. 右邊本來是位址, 強制轉換成 int 後, 才能合法成為被減的數字.

03/29 12:32, , 4F
offsetof ?
03/29 12:32, 4F

03/29 12:37, , 5F
oh 看錯了,剛好相反。
03/29 12:37, 5F
※ 編輯: supisces 來自: 96.55.113.197 (03/30 07:17)
文章代碼(AID): #1FSybPIo (C_and_CPP)