線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1830
推到 Plurk!
推到 Facebook!

指標字串記憶體位址

答題得分者是:arisaka_matsuri
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-28 10:42:51 IP:59.104.xxx.xxx 未訂閱
#include 
#include     int main()
{
    
    char name[10]="hello";      
    
    char *p=(char *)malloc(sizeof(char));
    p ="HELLO"; 
    
    printf("%c   %p\n",*name,name);
    printf("%c   %p\n",*(name 1),(name 1));
    printf("%c   %p\n",*(name 2),(name 2));
    printf("%c   %p\n",*(name 3),(name 3));
    printf("%c   %p\n\n\n",*(name 4),(name 4));
    
    printf("%c   %p\n",*p,&p 0);
    printf("%c   %p\n",*(p 1),&p 1);
    printf("%c   %p\n",*(p 2),&p 2);
    printf("%c   %p\n",*(p 3),&p 3);
    printf("%c   %p\n",*(p 4),&p 4);
    
    system("pause");
    return 0;
    
}    
char *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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-28 13:56:47 IP:140.113.xxx.xxx 未訂閱
基本觀念~
引言: 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-28 14:32:48 IP:140.129.xxx.xxx 未訂閱
引言:
#include 
#include     int main()
{
    
    char name[10]="hello";      
    
    char *p=(char *)malloc(sizeof(char));
    p ="HELLO"; 
    
    printf("%c   %p\n",*name,name);
    printf("%c   %p\n",*(name 1),(name 1));
    printf("%c   %p\n",*(name 2),(name 2));
    printf("%c   %p\n",*(name 3),(name 3));
    printf("%c   %p\n\n\n",*(name 4),(name 4));
    
    printf("%c   %p\n",*p,&p 0);
    printf("%c   %p\n",*(p 1),p 1); // &p 1:儲存指標變數p的位址再 1,以下相同!
    printf("%c   %p\n",*(p 2),p 2); 
    printf("%c   %p\n",*(p 3),p 3);
    printf("%c   %p\n",*(p 4),p 4);
    
    system("pause");
    return 0;
    
}    
char *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
附註: 原先以為的位址運算子'&'的優先順序較高,所以會先得到位址值(當成整數)再加數值1; 沒想到編譯器仍是將'&p' 的結果當成位址,因此加1的效果誠如windblown大大所補充,會指向下一個相同型態資料的所在位址. 在此特別提出更正! 同時感謝windblown的補充提醒!
windblown
中階會員


發表:0
回覆:117
積分:98
註冊:2003-11-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-28 15:09:05 IP:61.229.xxx.xxx 未訂閱
稍微補充 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-28 15:33:47 IP:59.104.xxx.xxx 未訂閱
謝謝各位大大解答 我好像有點感覺了^^
系統時間:2024-05-18 4:45:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!