對char* 和 char[]區(qū)別的一些理解

相同點

首先 這兩種類型都可以對應(yīng)一個字符串,比如:

char* a = "string1"; 
char b[] = "string2"; 
printf("a = %s, b = %s ", a, b); 

其中a是一個指向char變量的指針,b則是一個char數(shù)組(字符數(shù)組)眯亦,

其次 ,很多時候二者可以混用般码,像函數(shù)傳參數(shù)的時候妻率,實參可以是char*,形參可以是 char[],比如:

void fun1(char b[])
{ 
    printf("%s",b); 
}
int main()
{ 
    char* a = "HellowWorld"; 
    fun1(a); 
}

反過來板祝,實參可以是char[],形參可以是 char*也是可以的宫静。
存在即合理,char*和char[]肯定是有本質(zhì)的不同券时。

不同點

1.char*是變量孤里,值可以改變, char[]是常量橘洞,值不能改變捌袜。
比如:

char* a = "string1"; 
char b[] = "string2"; 
a = b;              //OK 
a = "string3";      //OK 
b = a;              //報錯!左邊操作數(shù)只讀 
b = "string3" ;     //報錯炸枣!左邊操作數(shù)只讀

解釋:a是一個char型指針變量虏等,其值(指向)可以改變弄唧; b是一個char型數(shù)組的名字,也是該數(shù)組首元素的地址霍衫,是常量候引,其值不可以改變 。

2.char[]對應(yīng)的內(nèi)存區(qū)域總是可寫敦跌,char*指向的區(qū)域有時可寫澄干,有時只讀
比如:

char* a = "string1"; 
char b[] = "string2"; 
gets(a);            //試圖將讀入的字符串保存到a指向的區(qū)域,運(yùn)行崩潰柠傍! 
gets(b);            //OK

解釋: a指向的是一個字符串常量麸俘,即指向的內(nèi)存區(qū)域只讀;
b始終指向他所代表的數(shù)組在內(nèi)存中的位置惧笛,始終可寫疾掰!
注意,若改成這樣gets(a)就合法了:

char* a = "string1"; 
char b[] = "string2"; 
a = b;              //a,b指向同一個區(qū)域徐紧,注意這里改變了a的指向 
gets(a);            //OK 
printf("%s",b);     //會出現(xiàn)gets(a)時輸入的結(jié)果 

解釋: a的值變成了是字符數(shù)組首地址静檬,即&b[0],該地址指向的區(qū)域是char *或者說 char[8]并级,習(xí)慣上稱該類型為字符數(shù)組拂檩,其實也可以稱之為“字符串變量”,區(qū)域可讀可寫嘲碧。

注意:char *本身是一個字符指針變量稻励,但是它既可以指向字符串常量,又可以指向字符串變量愈涩,指向的類型決定了對應(yīng)的字符串能不能改變望抽。

3.char * 和char[]的初始化操作有著根本區(qū)別:

測試代碼:

char* a = "Hello World"; 
char b[] = "Hello World"; 
printf("%s, %d\n","Hello World", "Hello World"); 
printf("%s, %d %d\n", a, a, &a); 
printf("%s, %d %d\n", b, b, &b); 

結(jié)果:


image.png

結(jié)果可見:盡管都對應(yīng)了相同的字符串,但”Hellow World”的地址 和 a對應(yīng)的地址相同履婉,與b指向的地址有較大差異煤篙;&a 、&b都是在同一內(nèi)存區(qū)域毁腿,且&b==b
根據(jù)c內(nèi)存區(qū)域劃分知識辑奈,我們知道,局部變量都創(chuàng)建在棧區(qū)已烤,而常量都創(chuàng)建在文字常量區(qū)鸠窗,顯然,a胯究、b都是棧區(qū)的變量稍计,但是a指向了常量(字符串常量),b則指向了變量(字符數(shù)組)裕循,指向了自己(&b==b==&b[0])臣嚣。

說明以下問題:

char * a=”string1”;是實現(xiàn)了3個操作:
1聲明一個char*變量(也就是聲明了一個指向char的指針變量)净刮。
2在內(nèi)存中的文字常量區(qū)中開辟了一個空間存儲字符串常量”string1”。
3返回這個區(qū)域的地址茧球,作為值庭瑰,賦給這個字符指針變量a
最終的結(jié)果:指針變量a指向了這一個字符串常量“string1”
(注意星持,如果這時候我們再執(zhí)行:char * c=”string1”抢埋;則,c==a督暂,實際上揪垄,只會執(zhí)行上述步驟的1和3,因為這個常量已經(jīng)在內(nèi)存中創(chuàng)建)

char b[]=”string2”;則是實現(xiàn)了2個操作:
1聲明一個char 的數(shù)組逻翁,
2為該數(shù)組“賦值”饥努,即將”string2”的每一個字符分別賦值給數(shù)組的每一個元素,存儲在棧上八回。
最終的結(jié)果:“數(shù)組的值”(注意不是b的值)等于”string2”酷愧,而不是b指向一個字符串常量。

PS:
實際上缠诅, char * a=”string1”; 的寫法是不規(guī)范的溶浴!
因為a指向了即字符常量,一旦strcpy(a,”string2”)就糟糕了管引,試圖向只讀的內(nèi)存區(qū)域?qū)懭胧堪埽绦驎罎⒌模”M管VS下的編譯器不會警告褥伴,但如果你使用了語法嚴(yán)謹(jǐn)?shù)腖inux下的C編譯器GCC谅将,或者在windows下使用MinGW編譯器就會得到警告。

所以重慢,我們還是應(yīng)當(dāng)按照”類型相同賦值”的原則來寫代碼: const char * a=”string1”;
保證意外賦值語句不會通過編譯饥臂。

小結(jié)
對于

const char* a = "string1"; 
char b[] = "string2";

1.a是const char 類型, b是char const類型
( 或者理解為 (const char)xx 和 char (const xx) )

2.a是一個指針變量似踱,a的值(指向)是可以改變的擅笔,但a只能指向(字符串)常量,指向的區(qū)域的內(nèi)容不可改變屯援;

3.b是一個指針常量猛们,b的值(指向)不能變;但b指向的目標(biāo)(數(shù)組b在內(nèi)存中的區(qū)域)的內(nèi)容是可變的狞洋。

4.作為函數(shù)的聲明的參數(shù)的時候弯淘,char []是被當(dāng)做char *來處理的!兩種形參聲明寫法完全等效吉懊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庐橙,一起剝皮案震驚了整個濱河市假勿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌态鳖,老刑警劉巖转培,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浆竭,居然都是意外死亡浸须,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門邦泄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來删窒,“玉大人,你說我怎么就攤上這事顺囊〖∷鳎” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵特碳,是天一觀的道長诚亚。 經(jīng)常有香客問我,道長午乓,這世上最難降的妖魔是什么站宗? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮硅瞧,結(jié)果婚禮上份乒,老公的妹妹穿的比我還像新娘。我一直安慰自己腕唧,他們只是感情好或辖,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枣接,像睡著了一般颂暇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上但惶,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天耳鸯,我揣著相機(jī)與錄音,去河邊找鬼膀曾。 笑死县爬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的添谊。 我是一名探鬼主播财喳,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耳高?” 一聲冷哼從身側(cè)響起扎瓶,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泌枪,沒想到半個月后概荷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碌燕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年误证,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陆蟆。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡雷厂,死狀恐怖惋增,靈堂內(nèi)的尸體忽然破棺而出叠殷,到底是詐尸還是另有隱情,我是刑警寧澤诈皿,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布林束,位于F島的核電站,受9級特大地震影響稽亏,放射性物質(zhì)發(fā)生泄漏壶冒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一截歉、第九天 我趴在偏房一處隱蔽的房頂上張望胖腾。 院中可真熱鬧,春花似錦瘪松、人聲如沸咸作。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽记罚。三九已至,卻和暖如春壳嚎,著一層夾襖步出監(jiān)牢的瞬間桐智,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工烟馅, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留说庭,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓郑趁,卻偏偏與公主長得像刊驴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子穿撮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型缺脉。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一痪欲。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,424評論 3 44
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,367評論 0 5
  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,325評論 0 2
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,742評論 0 38
  • 今天是放假的最后一天攻礼,我早早的就起來啦业踢。和平時一樣。 先漱口洗臉礁扮、洗臉完知举,然后讀經(jīng)典。最后在吃飯太伊,吃完飯后雇锡。我先檢...
    ZZ李夢涵閱讀 130評論 3 1