指標字串記憶體位址 |
答題得分者是:arisaka_matsuri
|
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
#includechar *p //所產生的是塊記憶體只是做存放指向某個字串頭個字元的位址嗎?? 例如:char *p="HELLO"; p只是指向H這字元位址嗎而不是產生出連續的記憶體空間存放整個"HELLO"字串是嗎??? 還有請問"所有指標"是不是單純只會產生一塊記憶體位址存放指向某個位址 ,而不是像陣列產出來連續的記憶體區塊存放資料,是這樣嗎?? malloc()配置好的記憶體 再給予字串 或是直接char *p="hello";有什麼差別嗎?? 請問下面兩塊記憶體位址怎麼會重複? 下面是執行結果 h 0022FF60 e 0022FF61 l 0022FF62 l 0022FF63 o 0022FF64 H 0022FF5C E 0022FF60 L 0022FF64 L 0022FF68 O 0022FF6C 請按任意鍵繼續 . . . 發表人 - syao 於 2005/07/28 11:25:54 |
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
基本觀念~
引言: char *p //所產生的是塊記憶體只是做存放指向某個字串頭個字元的位址嗎??沒錯!你產生一個「字元指標變數」,存放一個指向某個字元位址 引言: 例如:char *p="HELLO"; p只是指向H這字元位址嗎而不是產生出連續的記憶體空間存放整個"HELLO"字串是嗎???當你寫 "HELLO",編譯器會幫配置一塊區域存放 HELLO,執行時會載入在記憶體中(靜態配置的)。但是 p 呢?會取得在記憶體中 'H' 的位址,跟產不產生記憶體存放 HELLO 沒關係。 引言: 還有請問"所有指標"是不是單純只會產生一塊記憶體位址存放指向某個位址 ,而不是像陣列產出來連續的記憶體區塊存放資料,是這樣嗎??所有指標,不管任何型態,不會「產生」連續的記憶體區塊存放資料。一個指標在 32-bit Windows 環境下就是一個 4 bytes 大小的變數,也就是你說「產生一塊記憶體位址存放指向某個位址」。就像 int a; 宣告一個整數變數 a,double b; 宣告一個倍精數變數 b 一樣,你可以用 sizeof() 看看不同型態變數所花用的記憶體數量。 sizeof(int) --> 4 bytes sizeof(double) --> 8 bytes sizeof(char) --> 1 byte sizeof(char *) --> 4 bytes sizeof(void *) --> 4 bytes 引言: malloc()配置好的記憶體 再給予字串 或是直接char *p="hello";有什麼差別嗎??用malloc()是動態配置記憶體,用完要還~ char *p="hello"; --> 靜態配置,也就是編譯時就已經決定好存放的記憶體位置了。 其實,程式中有地方怪怪的 char *p=(char *)malloc(sizeof(char)); p ="HELLO";malloc()已經配置好一塊記憶體,大小只有「一個字元」(1 byte),p 存放「由malloc()配置的記憶體」的位址 但是,你又將 p 指向 "HELLO",這導致動態配置的記憶體再也無法操作,也就是malloc()配出來的空間,變成孤兒了~ 如果用malloc()動態配出記憶體要存放 HELLO,至少也得用 malloc(sizeof(char) * 5) 引言: 請問下面兩塊記憶體位址怎麼會重複?不是重複(也不可能),是printf("%c %p\n",*p,&p 0);用錯了~ &p 得到的是指標變數p的位址,應該用 p 就好 書上都有說唷~ |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
引言:附註: 原先以為的位址運算子'&'的優先順序較高,所以會先得到位址值(當成整數)再加數值1; 沒想到編譯器仍是將'&p' 的結果當成位址,因此加1的效果誠如windblown大大所補充,會指向下一個相同型態資料的所在位址. 在此特別提出更正! 同時感謝windblown的補充提醒!>#includechar *p //所產生的是塊記憶體只是做存放指向某個字串頭個字元的位址嗎?? 例如:char *p="HELLO"; p只是指向H這字元位址嗎而不是產生出連續的記憶體空間存放整個"HELLO"字串是嗎??? 還有請問"所有指標"是不是單純只會產生一塊記憶體位址存放指向某個位址 ,而不是像陣列產出來連續的記憶體區塊存放資料,是這樣嗎?? 指標變數主要是用來儲存與其所宣告相同資料型態變數的位址. 不管您動態宣告多大的記憶體區塊,總要有個能逐個訪問該動態陣列的機制,這就可以透過加減指標來達成,而一開始指標變數便承擔儲存該陣列開始元素所在位址的任務 malloc()配置好的記憶體 再給予字串 或是直接char *p="hello";有什麼差別嗎?? 前者是動態配置一塊記憶體,再將該記憶體區塊的起始位址傳回;後者則是讓指標變數指向已存在陣列的起始位址. 請問下面兩塊記憶體位址怎麼會重複? 您誤用了指標變數p的位址! 下面是執行結果 h 0022FF60 e 0022FF61 l 0022FF62 l 0022FF63 o 0022FF64 H 0022FF5C E 0022FF60 L 0022FF64 L 0022FF68 O 0022FF6C 請按任意鍵繼續 . . . 發表人 - syao 於 2005/07/28 11:25:54 |
windblown
中階會員 發表:0 回覆:117 積分:98 註冊:2003-11-14 發送簡訊給我 |
稍微補充 richtop 的說法
printf("%c %p\n",*(p+1),p+1); // p+1:指標變數p的位址再+1個位移,其位移大小為 p 所指向的型別大小,以下相同! 舉例說明
int* p1; // 假設 p1 的位址為 0x12345670 int* p2=p1+1; // 因為 p1 所指向的型別為 int, 而 32 bit 中, sizeof(int)=4, 所以 p2 = 0x12345674而 syao 的例子是 char* p; 因此剛好位移值為 1 |
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |