全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1281
推到 Plurk!
推到 Facebook!

有關於地址和型態的轉換的問題!

答題得分者是:aftcast
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-08 00:07:22 IP:59.125.xxx.xxx 未訂閱
能否請各位大大告訴我(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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-08 01:03:38 IP:59.115.xxx.xxx 訂閱
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
編輯記錄
aftcast 重新編輯於 2009-04-08 01:07:11, 註解 無‧
aftcast 重新編輯於 2009-04-08 01:08:02, 註解 無‧
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-08 09:07:48 IP:59.125.xxx.xxx 未訂閱
實在非常謝謝aftcast大大那麼詳細的解答,感謝大大的熱心!
謝謝!謝謝!!
------
-謝謝大大熱心的回覆!謝謝!
系統時間:2024-04-27 1:44:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!