有關於地址和型態的轉換的問題! |
答題得分者是:aftcast
|
l90425
初階會員 發表:95 回覆:152 積分:49 註冊:2008-04-03 發送簡訊給我 |
能否請各位大大告訴我(unsigned char*)&n的意思,我知道只取n的地址,但是又轉成unsigned char*就不知道是什麼意思了!
unsigned char *p = (unsigned char*)&n sizeof(n); 以及p的地址值是自己給的不怕發生用到他人的地址嗎? [code cpp] #include #include int main() { int n; char digit[]="0123456789ABCDEF"; while (1) { unsigned char *p = (unsigned char*)&n sizeof(n); printf("輸入一個整數(非數字則結束):"); if (scanf("%d", &n) < 1) break; printf("十六進位: "); while (--p >= &n) printf("%c%c", digit[(*p) >> 4], digit[(*p) & 0xf] ); printf("\n"); } system("pause"); return 0; } [/code] 謝謝!謝謝!!
------
-謝謝大大熱心的回覆!謝謝! 編輯記錄
l90425 重新編輯於 2009-04-08 00:08:07, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
1/ 因為你宣告了一個「指向unsigned char 資料的指標」,即unsigned char *p,而你賦與它的位址又是 int 資料n的所在位址,以compiler的角度來看,這樣是不匹配的。所以你把 &n ,即取得的位址,強迫compiler把它當做這個起始位址放的是一個 unsigned char 的資料。也因此達到有匹配的結果。
2/ p的位址是自己給的,所以當然很怕用到他人的位址,你是該心中充滿害怕的,至少我也是如此的害怕。c/c 的指標提供了很大的彈性,但也經常帶來不可預料的結果。可是雖然我們害怕,但只要正確的使用,一切就沒問題。以你這個例子來說(unsigned char*)&n sizeof(n); 這加總起來的位址是不安全的。雖然 n 的位址是compiler定的,所以不會和別的資料衝突,但sizeof(n)這個值加進去後安不安全?? 答案是不太安全。因為 int 的資料占4bytes, &n是指向最開始的位址,即第一個byte,&n 1指向第二,&n 2指向第三,&n 3指向第四byte,而sizeof(n) = 4,故是指向 &n 4,超過了n這個整數的最後一byte的位址。故 *p 取出來的資料可能不是你預期的。比對你的程式while裡你用了 --p 而且不是p-- 就是有這個細微的原因,但不要小看這小問題,搞錯了可能會當機喔! 若改成p-- 會有什麼結果? ……while最後一次的p會指向? ===================引 用 l90425 文 章=================== 能否請各位大大告訴我(unsigned char*)&n的意思,我知道只取n的地址,但是又轉成unsigned char*就不知道是什麼意思了! unsigned char *p = (unsigned char*)&n sizeof(n); 以及p的地址值是自己給的不怕發生用到他人的地址嗎? [code cpp] #include #include int main() { int n; char digit[]="0123456789ABCDEF"; while (1) { unsigned char *p = (unsigned char*)&n sizeof(n); printf("輸入一個整數(非數字則結束):"); if (scanf("%d", &n) < 1) break; printf("十六進位: "); while (--p >= &n) printf("%c%c", digit[(*p) >> 4], digit[(*p) & 0xf] ); printf("\n"); } system("pause"); return 0; } [/code] 謝謝!謝謝!!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
l90425
初階會員 發表:95 回覆:152 積分:49 註冊:2008-04-03 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |