字符數組和初始化
首先讓我來搞清字符串常量:
- 雙括號引起來的內容,編譯器自己在末尾追加\0,字符串中間沒有間隔或者空白字符。
- 保存在內存中,屬于靜態型存儲類別,字符串常量只會存儲一次,在整個程序的生命周期中存在,無論被函數調用多少次。
下面我們看看字符串數組
- 定義字符串數組時必須知道需要多少空間
- 在指定數組大小時,確保數組元素個數至少比字符串長度多1(放'\0'),所有未被使用的元素都被自動初始為0(這里的0是char 形式的空字符,不是數字字符0)
初始化形式: - 用足夠空間的數組存儲字符串
char car[10] = "Tata"; - 標準的字符串數組初始化
char m [10] ={'T','a','t','a','\0'};
數組與指針
另外我們也可以使用指針表示法創建一個字符串:
const char *pt1 = "Something is pointing at me."
再來看:
const char ar1[] = "Something is pointing at me."
上述兩種方式幾乎相同。但不完全相同,下面談談他們的不同點:
- 數組形式主要在內存分配一個內存為29個元素的數組,字符串保存在靜態存儲區,程序運行時才會給數組分配內存,字符串被拷貝到數組中,字符串有2個副本。
- 指針形式是編譯器為字符串在靜態存儲區預留29個元素的空間,一旦執行程序,它會為指針變量pt1留出一個存儲位置,并把字符串的地址存儲到指針變量中,該變量最初指向字符串首字符,但是它的值可以改變,可以使用遞增運算符。
就是說前者拷貝的是字符串,后者拷貝的是地址。
數組和指針的區別
假設有下面兩個聲明:
char heart[] ="I love Tillie!"
const char *head = "I love Tillie!"
區別
- 數組名是常量。指針名是變量。
- 數組名是常量,數組的元素是變量,可以修改正常修改數組中的元素。指針如果不用const修飾,修改字符串中的元素,那其他地方使用到這個字符串都會改變,因為指針獲取的是原字符串的地址,數組獲取的是原字符串的副本。
下面看個例子:
Snip20170310_64.png
結果為:
Snip20170310_65.png
可見 :
mytalents數組是一個內含5個指針的數組,在系統中占用40個字節。指向的字符串字面量不能改變,效率高,如果使用數組表示一系列待顯示的字符串,用指針數組效率高。
youtalents是一個內含5個數組的數組,每個數組含有40個char類型的值,共占用200個字節。可以改變字符串或者給字符串輸入預留空間。