您好,登錄后才能下訂單哦!
C語(yǔ)言的一個(gè)知識(shí)點(diǎn):
char *str1 = "hello world" 和 char str2[] = "hello world"; 的區(qū)別:
1、內(nèi)存管理:
內(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ù)決定。
免責(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)容。