這兩行代碼有什么區(qū)別? 從語法層面上講,上面的是指針,下面的是數(shù)組,但是想要搞清楚他們的區(qū)別,還得知道他們在內(nèi)存中怎么存儲的。
操作系統(tǒng)中,每個進(jìn)程在啟動的時(shí)候都會被分配一塊虛擬地址空間,這塊空間包含數(shù)據(jù)段、代碼段、堆、棧等等。
char*s="helloworld";s 屬于??臻g,在 64 位系統(tǒng)中占 8 個字節(jié)。
"helloworld" 我們把它稱作字符串常量,存放在只讀數(shù)據(jù)區(qū)。
既然是只讀數(shù)據(jù),那么它一定不能修改。
所以這條語句涉及兩塊內(nèi)存,??臻g的指針指向只讀數(shù)據(jù)區(qū)。
?
s 指向字符h,如果s++,那么就指向字符e。
?
但是因?yàn)?helloworld"是只讀數(shù)據(jù),所以 *s 不能修改,比如:
*s = 'a';運(yùn)行會出錯。
char s[] = "helloworld";s 是一個數(shù)組,"helloworld"用于初始化數(shù)組。 數(shù)組存放在棧空間,算上字符串后面的?,數(shù)組占 11 個字節(jié)。 既然是??臻g的數(shù)據(jù),我們就可以通過數(shù)組名去修改,比如:
s[0] = 'a';就是把字符 h 改成了 a。 但是由于數(shù)組名是常指針,表示的是數(shù)組首元素的地址,所以數(shù)組名不好修改。
s++;會在編譯的時(shí)候直接報(bào)錯。 要說他們倆有什么聯(lián)系,指針可以用下標(biāo)去訪問,數(shù)組也可以當(dāng)作指針來使用。
char *s1 = "helloworld"; printf("%c ",s1[1]); char s2[] = "helloworld"; printf("%c ", *(s2 + 1));
審核編輯:劉清
-
字符串
+關(guān)注
關(guān)注
1文章
579瀏覽量
20537 -
虛擬地
+關(guān)注
關(guān)注
0文章
2瀏覽量
5495
原文標(biāo)題:char *s 和 char s[] 的區(qū)別
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論