雙重指標存取字串
#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));
請問各位,小弟想要知道問題的點在哪邊
謝謝分享
謝謝分享
![]()
厲害!
首先, 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 能夠正確運作的版本
