[問題] pointer的問題

看板C_and_CPP作者 (剛好而已)時間13年前 (2011/08/25 03:08), 編輯推噓6(6013)
留言19則, 8人參與, 最新討論串2/2 (看更多)
int main (void) { int xyz=0; char *ptr = (char*)&xyz; func(ptr); cout<<"xyz="<<xyz<<endl; } 在func中處理ptr使最後印出之結果為 xyz=12345678 其實原本第4行 只有char* ptr = xyz; 但是這樣compile 會有error 所以加上了(char*) 問題在 如果ptr 是int* 就很好處理, *ptr = 12345678; 就可以了 但是是char* 我就不太懂要怎麼處理了 如果直接輸入 *ptr = 12345678 結果會是 xyz=78; 為什麼呢? (後來我了解了) 我測試發現如果 *ptr = 123 是可以的 再多一位就不行了 接著得知*ptr = 127 以內都可以在xyz中正確顯示 超過就會開始變得不同 之後開始思考如何把45678也給弄出來 想到用ptr[0] = 123 ptr[1] = 45 ptr[2] = 67...這樣 (<<沒仔細思考過的舉動) 結果根本跟我想的差超多 xyz出來會是一個很大的數字 接著發現不管ptr[7] = ? 都是那個值 所以了解ptr[7]是無關的東西 >ptr[6] 無關 >>>>>>>>>>ptr[3] 終於跟他有關!! 嘗試ptr[3]=1 結果大過於12345678 ptr[2]=1 65536 即便我大學沒學好 我還能理解到接著ptr[1] =1 會得到 256 而ptr[0] = 1 就會得到1 終於我就用 ptr[2] = 188; ptr[1] = 97; ptr[0] = 78; 得到xyz=12345678 ================================================================= 以上是個pointer沒學好的人花了一下午推出來的結果 ================================================================= 一個int型態資料佔有的記憶體空間是4byte,我完全知道 但是跟pointer混在一起我就沒有辦法很快理解到 只怪當初大學沒認真學,基本都知道但沒去融會貫通... 真的的問題是:要得到那個數字只能用除法12345678/65536..餘/256..餘放到ptr[0]嗎? 這樣子的做法(char* 指向 int)有什麼特別的意義或用途嗎目前想不到 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.0.34.42

08/25 03:26, , 1F
你上半部的問題範圍不小,說明會花不少篇幅,但下半部.
08/25 03:26, 1F

08/25 03:26, , 2F
方法就不只一種,只是你挑到的是讓你難理解的方法。
08/25 03:26, 2F

08/25 03:35, , 3F
簡單的方法 http://codepad.org/SkjxBlZe 去查 union.
08/25 03:35, 3F

08/25 03:37, , 4F
用char指標存入一整數會覺得麻煩是當然的 除法&取餘數
08/25 03:37, 4F

08/25 03:39, , 5F
存入一整數比較好懂的方法可以 *(int *)ptr=87654321;
08/25 03:39, 5F

08/25 03:47, , 6F
int佔4個bytes, char佔1個byte, 所以char pointer可以對
08/25 03:47, 6F

08/25 03:49, , 7F
各個byte一個個操作...把0xBC614E寫入就會變12345678了
08/25 03:49, 7F

08/25 03:50, , 8F
用途...目前只想得到host byte order跟network byte
08/25 03:50, 8F

08/25 03:50, , 9F
order間的轉換 XD"
08/25 03:50, 9F

08/25 03:51, , 10F
不過上面這個用途已經有內建函式,也不必自己刻 XD
08/25 03:51, 10F

08/25 07:08, , 11F
寫入0xBC614E 怎麼寫入?
08/25 07:08, 11F

08/25 08:44, , 12F
宣告另一個整數,用 memcpy 複製過去吧...
08/25 08:44, 12F

08/25 08:46, , 13F
cloudlim:C沒有規定int是4位元組,也沒有規定endianness
08/25 08:46, 13F

08/25 08:51, , 14F
POSIX 的 XtoYZ 系列用 uintN_t 而不用 int 是有道理的...
08/25 08:51, 14F

08/25 10:45, , 15F
請問 Favonia 大大 *(int*)ptr = 12345678 合不合標準~
08/25 10:45, 15F

08/25 10:51, , 16F
指標轉換本來就沒有保證一定成功
08/25 10:51, 16F

08/25 11:22, , 17F
@scwg:6.3.2.2/7意思似乎是會轉回原本的指標,應該沒事xDD
08/25 11:22, 17F

08/25 11:23, , 18F
打錯了是6.3.2.3/7囧
08/25 11:23, 18F

08/25 14:26, , 19F
恩 我假設了大部分PC上的情況 這樣的確會很不portable
08/25 14:26, 19F
文章代碼(AID): #1ELKmkx9 (C_and_CPP)
文章代碼(AID): #1ELKmkx9 (C_and_CPP)