溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

char *str1 和 char str2[]的詳解

發(fā)布時(shí)間:2020-07-03 12:34:34 來(lái)源:網(wǎng)絡(luò) 閱讀:1316 作者:匯天下豪杰 欄目:編程語(yǔ)言

C語(yǔ)言的一個(gè)知識(shí)點(diǎn):

  char *str1 = "hello world" 和 char str2[] = "hello world"; 的區(qū)別:

1、內(nèi)存管理:

         char *str1 和 char str2[]的詳解

  內(nèi)存分為了:只讀代碼段,只讀數(shù)據(jù)段,BSS,堆,棧五個(gè)不同區(qū)域。

  如上圖所示: 只讀代碼段一般存放的是編寫(xiě)好的程序。

  只讀數(shù)據(jù)段放的是常量(字符串常量,數(shù)組名稱(chēng),函數(shù)名稱(chēng)),只讀區(qū)域不能更改!

  BSS區(qū)域存放的是全局變量和static靜態(tài)類(lèi)變量,又分為未初始化,值都為0,和已初始化區(qū)域。

  堆中存放的是malloc(),calloc()……申請(qǐng)的空間,不由操作系統(tǒng)回收,必須靠程序員自己通過(guò)free()回收空間,不然就是內(nèi)存泄漏?。?!

  棧中存放的是局部變量,形參變量,棧中空間可被任何函數(shù)使用,是數(shù)據(jù)的可靠性很低!


2、str1是指針變量,str1++; right,指針加減整型,結(jié)果還是指針。

  對(duì)于str2而言,char str2[] = "hello world"; <=> char str2[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\0'}; 

  這是對(duì)字符數(shù)組初始化,所以str2是數(shù)組名稱(chēng)(指針常量),str2++;false,常量不能賦值!

  "hello world"字符串本身就是以0結(jié)尾的字符數(shù)組?。?!      

3、"hello world"字符串常量在只讀數(shù)據(jù)段,值本身內(nèi)容不能被更改!??!

  str1為指針變量,*str1 = 't'; false,更改的是只讀數(shù)據(jù)段中的區(qū)域。

  str2為數(shù)組名稱(chēng),其空間在棧中申請(qǐng),*str2 = 't'; true,棧中的數(shù)據(jù)可以被更改。

4、對(duì)char *str1 = "hello world"的深刻理解

  strlen(str1);        11

  strlen(str2);        11

  sizeof(str2);        12   數(shù)組名稱(chēng),求字節(jié)數(shù),是數(shù)組所申請(qǐng)的空間的字節(jié)數(shù),在上0結(jié)束標(biāo)志。   

  sizeof(str1);        4/8  與平臺(tái)有關(guān),32位系統(tǒng)下,指針4字節(jié),64位,指針8字節(jié) 

  sizeof(*str1);       1    *str1 就是'h',占用一個(gè)字節(jié)。

  sizeof("hello world");   12   字符串常量所占空間

  strlen();函數(shù),求得是字符串長(zhǎng)度,不算那個(gè)0;sizeof();關(guān)鍵字,單目運(yùn)算符,求字節(jié)數(shù),算字符串的結(jié)束標(biāo)志0。

5、[]中的值,由初值個(gè)數(shù)決定。



向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

r1 st
AI