[問題]雙重 指標存取字串

看板C_and_CPP作者 (丹楓)時間8年前 (2016/04/04 13:47), 8年前編輯推噓10(10027)
留言37則, 6人參與, 最新討論串1/3 (看更多)
http://ideone.com/UhNQlR 先附上原始程式碼 這是某本書上的範例但是照打上去於DEv編譯會出現錯誤 問題1 : 對於ptr = temp 的這行意義不是很了解 看字面上似乎想要讓ptr指標指向temp指標存取的值(指向某字串的位址) 但temp並未初始,所以這個步驟對我來說有點詭異 問題2 : 我假設問題1的步驟可能是要這樣寫 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)); 想要知道問題的點在哪邊 Orz ..毫無頭緒 問題3 : 關於置底常見錯誤的12 別想對二維陣列使用pointer to pointer 想請問各位前輩時否有現成的案例可供小弟參考 最近也是有類似的想法正在練習不過好像沒出現問題 怕我正在走上這條看似正確的誤途上 初次在板上請教,煩請各位不吝指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.126.35.91 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1459748840.A.555.html ※ 編輯: mp8113f (59.126.35.91), 04/04/2016 13:49:44 ※ 編輯: mp8113f (59.126.35.91), 04/04/2016 13:51:39

04/04 13:55, , 1F
看到char **ptr,建議你還是換本書好了
04/04 13:55, 1F

04/04 15:40, , 2F
一樓?為什麼?
04/04 15:40, 2F

04/04 16:03, , 3F
有兩顆*就會有三顆,四顆,沒完沒了啊,無法理解的用法
04/04 16:03, 3F

04/04 16:04, , 4F
.............這是什麼理由
04/04 16:04, 4F

04/04 16:04, , 5F
我也想知道為甚麼,還是char** ptr比較簡潔明瞭呢
04/04 16:04, 5F

04/04 16:05, , 6F
另外問題二我想了想,是不是因為直接對*ptr做加減不保險
04/04 16:05, 6F

04/04 16:06, , 7F
因為不一定會有stack區塊讓他存? 所以有些人可過有些不
04/04 16:06, 7F

04/04 16:15, , 8F
我常看MSDN,可是機乎都不會出現兩顆**的指標
04/04 16:15, 8F

04/04 16:16, , 9F
大部分都typedef成一個類型,這樣比較清楚
04/04 16:16, 9F

04/04 16:17, , 10F
那如果該宣告pointer to pointer,該怎麼寫比較專業
04/04 16:17, 10F

04/04 16:17, , 11F
了解我再研究這個方式看看,感謝 !
04/04 16:17, 11F

04/04 16:18, , 12F
不過問題二還是不太清楚....囧
04/04 16:18, 12F

04/04 16:19, , 13F
應該對pointer定義成看的懂,易理解明確的名稱
04/04 16:19, 13F

04/04 16:20, , 14F
指標是新手的罩門呀,其實不用想太多,把指標看成變數
04/04 16:20, 14F

04/04 16:21, , 15F
最多就兩顆吧
04/04 16:21, 15F

04/04 21:12, , 16F
到底為什麼會到三顆四顆 最多就兩顆阿
04/04 21:12, 16F

04/04 21:18, , 17F
然後char**是強調型別為char**的ptr變數
04/04 21:18, 17F

04/04 21:19, , 18F
char **ptr是char型別的雙重指標 兩個都可以 看你想法
04/04 21:19, 18F

04/04 21:27, , 19F
然後問題二 你這樣是把三個string變數記憶體位置扔給
04/04 21:27, 19F

04/04 21:28, , 20F
ptr存,連續的是你的ptr 但那三個本來就不一定會連續
04/04 21:28, 20F

04/04 21:30, , 21F
我大致上懂了,所以若我要連續存,最好方法是
04/04 21:30, 21F

04/04 21:31, , 22F
我設定一個temp指標矩陣確保連續對吧?
04/04 21:31, 22F

04/04 21:33, , 23F
不用阿...你&ptr &(ptr+1) &(ptr+2)出來會連續沒錯
04/04 21:33, 23F

04/04 21:34, , 24F
沒事,我弄反了,string本身不連續所以這樣做不太保險
04/04 21:34, 24F

04/04 21:35, , 25F
感謝你的解說 !
04/04 21:35, 25F

04/04 21:37, , 26F
若要確保三個字串連續那應該開個矩陣存這三串了
04/04 21:37, 26F

04/04 21:37, , 27F
就不能用分開的方式存入指標
04/04 21:37, 27F

04/04 21:37, , 28F
yes
04/04 21:37, 28F

04/04 21:49, , 29F
了解,不過這題我編譯沒問題,但執行會意外錯誤,
04/04 21:49, 29F

04/04 21:50, , 30F
只能再找找是不是哪邊寫錯了
04/04 21:50, 30F

04/04 22:02, , 31F
指標可以存三種東西 0、某個物件的記憶體、另一個指標
04/04 22:02, 31F

04/04 22:03, , 32F
你那個temp沒指東西,然後ptr又指向它 很容易出錯的
04/04 22:03, 32F

04/04 22:04, , 33F
感謝k大指點,回去馬上debug
04/04 22:04, 33F

04/04 22:27, , 34F
如果你只學C,兩個*有存在必要,你不能這樣就把書丟掉
04/04 22:27, 34F

04/04 22:28, , 35F
但如果你用的是C++,那你就不會看到兩個*了
04/04 22:28, 35F

04/04 22:30, , 36F
總而言之,建議你學C++而不是C
04/04 22:30, 36F

04/04 22:56, , 37F
好的,下一個階段即是要準備學c +
04/04 22:56, 37F
文章代碼(AID): #1N0V_eLL (C_and_CPP)
文章代碼(AID): #1N0V_eLL (C_and_CPP)