字符數(shù)組和初始化
首先讓我來搞清字符串常量:
- 雙括號(hào)引起來的內(nèi)容袭异,編譯器自己在末尾追加\0珊豹,字符串中間沒有間隔或者空白字符威创。
- 保存在內(nèi)存中,屬于靜態(tài)型存儲(chǔ)類別析显,字符串常量只會(huì)存儲(chǔ)一次鲫咽,在整個(gè)程序的生命周期中存在,無論被函數(shù)調(diào)用多少次谷异。
下面我們看看字符串?dāng)?shù)組
- 定義字符串?dāng)?shù)組時(shí)必須知道需要多少空間
- 在指定數(shù)組大小時(shí)分尸,確保數(shù)組元素個(gè)數(shù)至少比字符串長度多1(放'\0'),所有未被使用的元素都被自動(dòng)初始為0(這里的0是char 形式的空字符,不是數(shù)字字符0)
初始化形式: - 用足夠空間的數(shù)組存儲(chǔ)字符串
char car[10] = "Tata"; - 標(biāo)準(zhǔn)的字符串?dāng)?shù)組初始化
char m [10] ={'T','a','t','a','\0'};
數(shù)組與指針
另外我們也可以使用指針表示法創(chuàng)建一個(gè)字符串:
const char *pt1 = "Something is pointing at me."
再來看:
const char ar1[] = "Something is pointing at me."
上述兩種方式幾乎相同歹嘹。但不完全相同箩绍,下面談?wù)勊麄兊牟煌c(diǎn):
- 數(shù)組形式主要在內(nèi)存分配一個(gè)內(nèi)存為29個(gè)元素的數(shù)組,字符串保存在靜態(tài)存儲(chǔ)區(qū)尺上,程序運(yùn)行時(shí)才會(huì)給數(shù)組分配內(nèi)存伶选,字符串被拷貝到數(shù)組中,字符串有2個(gè)副本尖昏。
- 指針形式是編譯器為字符串在靜態(tài)存儲(chǔ)區(qū)預(yù)留29個(gè)元素的空間仰税,一旦執(zhí)行程序,它會(huì)為指針變量pt1留出一個(gè)存儲(chǔ)位置抽诉,并把字符串的地址存儲(chǔ)到指針變量中陨簇,該變量最初指向字符串首字符,但是它的值可以改變迹淌,可以使用遞增運(yùn)算符河绽。
就是說前者拷貝的是字符串,后者拷貝的是地址唉窃。
數(shù)組和指針的區(qū)別
假設(shè)有下面兩個(gè)聲明:
char heart[] ="I love Tillie!"
const char *head = "I love Tillie!"
區(qū)別
- 數(shù)組名是常量耙饰。指針名是變量。
- 數(shù)組名是常量纹份,數(shù)組的元素是變量苟跪,可以修改正常修改數(shù)組中的元素。指針如果不用const修飾蔓涧,修改字符串中的元素件已,那其他地方使用到這個(gè)字符串都會(huì)改變,因?yàn)橹羔槴@取的是原字符串的地址元暴,數(shù)組獲取的是原字符串的副本篷扩。
下面看個(gè)例子:
Snip20170310_64.png
結(jié)果為:
Snip20170310_65.png
可見 :
mytalents數(shù)組是一個(gè)內(nèi)含5個(gè)指針的數(shù)組,在系統(tǒng)中占用40個(gè)字節(jié)茉盏。指向的字符串字面量不能改變鉴未,效率高枢冤,如果使用數(shù)組表示一系列待顯示的字符串,用指針數(shù)組效率高铜秆。
youtalents是一個(gè)內(nèi)含5個(gè)數(shù)組的數(shù)組淹真,每個(gè)數(shù)組含有40個(gè)char類型的值,共占用200個(gè)字節(jié)羽峰√伺兀可以改變字符串或者給字符串輸入預(yù)留空間。