【C/C++】char* 和 char[]的區(qū)別

原文鏈接:(只是格式化了一下好看。)
https://blog.csdn.net/u012611878/article/details/78291036

相同點(diǎn)

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

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

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

2. 其次 德迹,很多時(shí)候二者可以混用芽卿,像函數(shù)傳參數(shù)的時(shí)候,實(shí)參可以是char*,形參可以是 char[]胳搞,比如:

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

反過來卸例,實(shí)參可以是char[],形參可以是 char *也是可以的。
存在即合理肌毅,char *和char[]肯定是有本質(zhì)的不同筷转。

不同點(diǎn)

1. char*是變量,值可以改變芽腾, char[]是常量旦装,值不能改變。

比如:

char * a="string1"; 
char b[]="string2"; 
a=b摊滔; //OK 
a="string3"; //OK 
b=a; //報(bào)錯(cuò)阴绢!左邊操作數(shù)只讀 
b="string3" //報(bào)錯(cuò)店乐!左邊操作數(shù)只讀

解釋: a是一個(gè)char型指針變量,其值(指向)可以改變呻袭;
b是一個(gè)char型數(shù)組的名字眨八,也是該數(shù)組首元素的地址,是常量左电,其值不可以改變 廉侧。

2. char[]對應(yīng)的內(nèi)存區(qū)域總是可寫,char*指向的區(qū)域有時(shí)可寫篓足,有時(shí)只讀

比如:

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

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

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

解釋:a的值變成了是字符數(shù)組首地址贴彼,即&b[0]潜腻,該地址指向的區(qū)域是char *或者說 char[8],習(xí)慣上稱該類型為字符數(shù)組器仗,其實(shí)也可以稱之為"字符串變量"融涣,區(qū)域可讀可寫。

注意:char *本身是一個(gè)字符指針變量青灼,但是它既可以指向字符串常量暴心,又可以指向字符串變量,指向的類型決定了對應(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ū)域劃分知識(shí)策橘,我們知道炸渡,局部變量都創(chuàng)建在棧區(qū),而常量都創(chuàng)建在文字常量區(qū)丽已,顯然蚌堵,a、b都是棧區(qū)的變量,但是a指向了常量(字符串常量)吼畏,b則指向了變量(字符數(shù)組)督赤,指向了自己(&b==b==&b[0])。

說明以下問題:

char * a="string1";是實(shí)現(xiàn)了3個(gè)操作:

  1. 聲明一個(gè)char*變量(也就是聲明了一個(gè)指向char的指針變量)泻蚊。
  2. 在內(nèi)存中的文字常量區(qū)中開辟了一個(gè)空間存儲(chǔ)字符串常量"string1"躲舌。
  3. 返回這個(gè)區(qū)域的地址,作為值性雄,賦給這個(gè)字符指針變量a

最終的結(jié)果:指針變量a指向了這一個(gè)字符串常量"string1"(注意没卸,如果這時(shí)候我們再執(zhí)行:char * c="string1";則秒旋,c==a约计,實(shí)際上,只會(huì)執(zhí)行上述步驟的1和3滩褥,因?yàn)檫@個(gè)常量已經(jīng)在內(nèi)存中創(chuàng)建)

char b[]="string2";則是實(shí)現(xiàn)了2個(gè)操作:

  1. 聲明一個(gè)char 的數(shù)組病蛉,
  2. 為該數(shù)組"賦值"炫加,即將"string2"的每一個(gè)字符分別賦值給數(shù)組的每一個(gè)元素瑰煎,存儲(chǔ)在棧上。

最終的結(jié)果:"數(shù)組的值"(注意不是b的值)等于"string2"俗孝,而不是b指向一個(gè)字符串常量

PS:
實(shí)際上酒甸, char * a="string1"; 的寫法是不規(guī)范的!
因?yàn)閍指向了即字符常量赋铝,一旦strcpy(a,"string2")就糟糕了插勤,試圖向只讀的內(nèi)存區(qū)域?qū)懭耄绦驎?huì)崩潰的革骨!盡管VS下的編譯器不會(huì)警告农尖,但如果你使用了語法嚴(yán)謹(jǐn)?shù)腖inux下的C編譯器GCC,或者在windows下使用MinGW編譯器就會(huì)得到警告良哲。

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

小結(jié)

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

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

  2. a是一個(gè)指針變量滑沧,a的值(指向)是可以改變的,但a只能指向(字符串)常量巍实,指向的區(qū)域的內(nèi)容不可改變滓技;

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叠必,一起剝皮案震驚了整個(gè)濱河市外潜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挠唆,老刑警劉巖处窥,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玄组,居然都是意外死亡滔驾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門俄讹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哆致,“玉大人,你說我怎么就攤上這事患膛√В” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵踪蹬,是天一觀的道長胞此。 經(jīng)常有香客問我,道長跃捣,這世上最難降的妖魔是什么漱牵? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮疚漆,結(jié)果婚禮上酣胀,老公的妹妹穿的比我還像新娘。我一直安慰自己娶聘,他們只是感情好闻镶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丸升,像睡著了一般铆农。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上发钝,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天顿涣,我揣著相機(jī)與錄音,去河邊找鬼酝豪。 笑死涛碑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孵淘。 我是一名探鬼主播蒲障,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了揉阎?” 一聲冷哼從身側(cè)響起庄撮,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毙籽,沒想到半個(gè)月后洞斯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坑赡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年烙如,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毅否。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亚铁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出螟加,到底是詐尸還是另有隱情徘溢,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布捆探,位于F島的核電站然爆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏徐许。R本人自食惡果不足惜施蜜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雌隅。 院中可真熱鬧,春花似錦缸沃、人聲如沸恰起。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽检盼。三九已至,卻和暖如春翘单,著一層夾襖步出監(jiān)牢的瞬間吨枉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工哄芜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留貌亭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓认臊,卻偏偏與公主長得像圃庭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • 相同點(diǎn) 首先 這兩種類型都可以對應(yīng)一個(gè)字符串剧腻,比如: 其中a是一個(gè)指向char變量的指針拘央,b則是一個(gè)char數(shù)組(...
    quliikay閱讀 914評論 0 1
  • 1)字符串操作strcpy(p, p1) 復(fù)制字符串strncpy(p, p1, n) 復(fù)制指定長度字符串strc...
    XDgbh閱讀 4,393評論 0 10
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一书在。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)灰伟; ...
    朱森閱讀 3,424評論 3 44
  • 本文轉(zhuǎn)自:http://www.cnblogs.com/lidabo/p/5225868.html 1)字符串操作...
    XiaohuiLI閱讀 9,480評論 0 0
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,367評論 0 5