這兩行代碼有什么區(qū)別? 從語法層面上講,上面的是指針,下面的是數(shù)組,但是想要搞清楚他們的區(qū)別,還得知道他們在內(nèi)存中怎么存儲的。
操作系統(tǒng)中,每個進程在啟動的時候都會被分配一塊虛擬地址空間,這塊空間包含數(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。

但是因為"helloworld"是只讀數(shù)據(jù),所以 *s 不能修改,比如:
*s = 'a';運行會出錯。
char s[] = "helloworld";s 是一個數(shù)組,"helloworld"用于初始化數(shù)組。 數(shù)組存放在??臻g,算上字符串后面的?,數(shù)組占 11 個字節(jié)。 既然是棧空間的數(shù)據(jù),我們就可以通過數(shù)組名去修改,比如:
s[0] = 'a';就是把字符 h 改成了 a。 但是由于數(shù)組名是常指針,表示的是數(shù)組首元素的地址,所以數(shù)組名不好修改。
s++;會在編譯的時候直接報錯。 要說他們倆有什么聯(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文章
590瀏覽量
22293 -
虛擬地
+關(guān)注
關(guān)注
0文章
2瀏覽量
5532
原文標(biāo)題:char *s 和 char s[] 的區(qū)別
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄

error: incompatible types when assigning to type ‘char[20]’ from type ‘char **’
bit和int char基本認識及區(qū)別

char *和char數(shù)組的區(qū)別及內(nèi)核訪問用戶區(qū)
浮點數(shù)在內(nèi)存中的存儲

char 與unsigned char在嵌入式開發(fā)中的區(qū)別

51單片機 對 char 反序列輸出,以及注意事項

MCU_C語言中 數(shù)組型指針 的應(yīng)用 -- char (*stringp)[]
![MCU_C語言中 數(shù)組型指針 的應(yīng)用 -- <b class='flag-5'>char</b> (*stringp)[]](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
字符型char和整型int之間的關(guān)系

評論