[爆卦]字串 指標陣列是什麼?優點缺點精華區懶人包

為什麼這篇字串 指標陣列鄉民發文收入到精華區:因為在字串 指標陣列這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者phi61023 (PHI)看板C_and_CPP標題[問題] 請教字元陣列與字串指標的差異?時...


各位前輩您好:

小弟最近在研讀C的指標,但有一處就是很疑惑,想請教各位大大

char *str = "test";



char str[] = "test";

本質上究竟有沒有差異呢?
或是說什麼時候一定要用 char *str ?
什麼時候一定要用 char str[] 呢?

PS.其實小弟是在玩"雙重指標"的時候遇到這樣的疑問的,麻煩各位大大往這個方向解惑
感恩感恩!!

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.75.189.169
james732:置底文十三戒第四 10/12 10:28
angleevil:其實char *str很單純指向char空間而已.[]<--這個是讓很 10/12 10:30
angleevil:多新手產生迷惑地方.第二個例子是char str[5] = "test"; 10/12 10:31
shadow0326:第一個是宣告一個指向const字串的指標 第二個是直接配 10/12 10:32
angleevil:你創造一個陣列空間,且把test放入而已 10/12 10:32
shadow0326:置好空間然後初始化為指定的字串 10/12 10:32
shadow0326:所以你如果加一行str[0] = 'a' 前者就會seg fault了 10/12 10:33
diabloevagto:http://codepad.org/KSh9wBdz 可以正常更改說... 10/12 10:46
diabloevagto:抱歉我搞錯了=.= 10/12 10:47
littleshan:第一個寫法若加上 str[0]='a' 結果是 undefined 10/12 10:48
littleshan:意思是任何情況都有可能 (包括什麼事都沒發生) 10/12 10:49
diabloevagto:http://codepad.org/8UHaqO21 請問各位大大這個觀念 10/12 10:51
diabloevagto:對不對qq? 10/12 10:51
angleevil:a="vvv"<--這個馬上就出問題了,請改快去看十三戒 10/12 12:50
tropical72:@diabloevagto:不完全對,char* a="xx" ,os是會為它配空 10/12 13:34
tropical72:間存進去,但要視該空間為"唯讀",不能再去改. 10/12 13:35
priv:@diabloevagto *a = "vvv"不會成功的理由不是唯讀 10/12 14:09
priv:是因為型別錯了,如果a = "vvv"還是會成功 10/12 14:10
priv:會導致本來指向"AAA"這個常數字串的指標a改指向常數字串"vvv" 10/12 14:11
priv:如果不懂後面的架構的話,我建議初學者要做的事就是 10/12 14:12
priv:請「完全不要」用等號去操作c式字串 10/12 14:12
tropical72:感謝 priv 補充指正。 10/12 14:14
priv:char str[] = "test";一行宣告其實後面是三個動作 10/12 14:16
priv:相當於先宣告char str[5]後,用strcpy把"test"拷進str[] 10/12 14:16
priv:char *str = "test"則沒有產生陣列空間的這個動作 10/12 14:17
priv:單純把str這個指標指向常數字串"test" 10/12 14:18
priv:先學過別的語言的人很容易發生這種認知上的誤解 10/12 14:21
priv:char *str和char str[]操作上的差別對初學者來說最重要的只有 10/12 14:21
priv:陣列宣告的時候會配空間,指標宣告的時候不會 10/12 14:22
priv:所以如果要使幅char*去處理字串你必需指向我們自己配置的空間 10/12 14:22
priv:例如說指向另一個char [],或者用malloc手動配置空間 10/12 14:23
diabloevagto:我就是想說要重新指向令一個字串,請問問題是出在說 10/12 16:58
diabloevagto:我應該要先把就有的空間釋放,然後再重新指向令一個 10/12 16:59
diabloevagto:新創造出來的空間嗎?麻煩大家指教了! 10/12 16:59
priv:c如果字串不是很長通常都是直接開一個陣列,都在裡面操作 10/12 17:12
priv:要改變字串內容的時候用strcpy去置換 10/12 17:12
priv:在程式裡面所有的"ooxxx"這樣的字串,經過編譯後 10/12 17:16
priv:都會放在程式的data區段,這部份你是不需要去free的 10/12 17:17
priv:如果只是單純指向一個字串取它的值來用,用等於可以 10/12 17:17
priv:怕就怕一知半解,你又想用char*去改變字串的部份內容 10/12 17:17
james732:建議diabloevagto把問題寫得更具體一點 10/12 17:19
priv:最近看板上很多人學C好像都先寫再說 10/12 17:19
diabloevagto:所以是說,重新指向是合理的,但還是不建議這樣使用 10/12 17:19
priv:我們以前學C都是先抄sample然後試著看懂它,再寫習題 10/12 17:19
diabloevagto:,另外要記得不要用char*去改變其中一個數值 10/12 17:20
priv:我覺得很多問題你按步就班每個章節寫個幾題就不會問了 10/12 17:20
diabloevagto:不好意思...因為幾乎都在用string,像是char比較少用 10/12 17:21
priv:學C的話就C Programming Language找一本來看吧,中英都可 10/12 17:22
priv:二百多頁的小書,要查要看都看快 10/12 17:22
xatier:K&R 本對初學者有點太難了吧XD 10/12 21:49
firejox:先去把Q&A看完再講 10/12 22:06
angleevil:我覺得13戒就是一個非常好的範本了,但是沒人去鳥他 10/12 23:19
james732:我有鳥啊,一樓就推了XD 10/12 23:20
angleevil:這是我一直覺得很不喜歡的地方. 10/12 23:20
angleevil:james732...不是說你,我是只剛近來發問的人 10/12 23:21
angleevil:而且你對話有點... 10/12 23:21
james732:其實我本來沒那個意思....XD 10/12 23:22

你可能也想看看

搜尋相關網站