評價: 0 回應: 5 閱覽: 760
置頂

雙重指標存取字串

#include <stdio.h>

int main(void) {
char **ptr;
int n,m;
char *temp;
char *string1 = "BOOK";
char *string2 = "FOR";
char *string3 = "YOU";

ptr = temp;

printf("\n ptr 的位址 = p\n",ptr);
for(n=0 ; n<3 ;n++)
{
printf("\n *(ptr+d)所存的位址 = p\n",n,*(ptr+n));
printf("*(ptr+d)指向字串 s\n",n,*(ptr+n));

for(m=0 ; *(*(ptr+n)+m) != '\0'; m++)
printf("*(*(ptr+d)+d) = c \n",n,m,*(*(ptr+n)+m)) ;
}
return 0;
}

對於ptr = temp 的這行意義不是很了解

看字面上似乎想要讓ptr指標指向temp指標存取的值(指向某字串的位址)

但temp並未初始,所以這個步驟對我來說有點詭異

假設步驟可能是要這樣寫

ptr = &temp

那麼我想要讓三個字串的起始位址連續存入三個記憶體位址中

於是我也寫了跟範例一樣的語法

*(ptr+0) = string1;
*(ptr+1) = string2;
*(ptr+2) = string3;

而我想要確認這三個位址是否真的連續接著

於是自行加上輸出

for(n=0 ; n<3 ; n++)

printf("第d個字串的位址為p\n",n+1,*(ptr+n));

不過1跟2的位址是連續,但第三個位址直接跳去不知道哪個地方

很明顯不連續

以至於我在加上輸出列印時就產生錯誤

for(n=0 ; n<3 ; n++)

printf("第d個字串的字串為s\n",n+1,*(ptr+n));

請問各位,小弟想要知道問題的點在哪邊

熱門回應

謝謝分享

謝謝分享

smiley

厲害!

首先, ptr 是 char**, 而它指向的 temp 是 char*

也就是它是單一指標, 不是陣列

這種情況下你讀取 *(ptr + 1) 只會拿到垃圾

如果寫入 *(ptr + 1) = xxx...

那就是系統爆炸的開始

因為 ptr 是 char**, temp 是 char*

所以必須寫 ptr = &temp

這麼做的目的通常是因為你想讓 temp 指到別的地方去

例如:
 

    temp = string1;
    printf("temp is s\n", temp);
    char **ptr2 = &temp;
    // 修改 *ptr2 會影響到 temp
    *ptr2 = string2;
    printf("temp now is s\n", temp);

輸出應該是:
temp is BOOK
temp now is FOR


那麼既然 ptr + n 只會拿到垃圾, 為什麼你的版本可以印出字串來?

因為你把 temp 宣告在 string[1-3] 的前面

所以 ptr + n 很 "狗屎運" 的剛好指到你的 string

如果你把 temp 宣告改放在 string3 後面, 結果就不同了

或是你改動一下 string 123 的宣告順序, 結果也會不一樣


我不知道這個範例到底要講什麼主題

但後面那個 for 看起來佔了很大的部份

所以給你一個 ptr + n 能夠正確運作的版本

http://ideone.com/GbvhOv

會員登入 (先登入會員才能回覆留言喔!)

Facebook留言