字元指標 定長字元陣列 不定長字元陣列 字元的區別

2021-10-03 15:36:30 字數 3071 閱讀 1958

先來點基礎知識:

printf中分別代表的輸出型別:   

%c:字元

%d:有符號十進位制整數

%f:浮點數(包括float和doulbe)

%e(%e):浮點數指數輸出[e-(e-)記數法]

%g(%g):浮點數不顯無意義的零"0"

%i:有符號十進位制整數(與%d相同)

%u:無符號十進位制整數

%o:八進位制整數 e.g. 0123

%x(%x):十六進製制整數0f(0f) e.g. 0x1234

%p:指標

%s:字串

字元指標 char *p,只可接收已知的字串字面量,本身大小4byte(32位機)指向空間大小由已知字串大小決定,可以不初始化。

定長字元陣列 char a[100],可接收已知或未知的字串,本身大小就是100,可以不初始化。

不定長字元陣列 char b[ ],只可接收已知的字串字面量,本身大小是已知字元穿大小+1,且必須初始化。

字元 char c,就是乙個字元,佔空間為1byte。

下面實驗一下:

下面是**值。range1是字元指標,其指向字串常量。range2是定長字元陣列,前五個字元是初始值,後面的5個字元預設為0或者說是『\0』代替。range3是不定長字元陣列,初始化的時候除了原有的6個字元又增加了1個字元『\0』。range5是定長字元陣列,其跟range2唯一的不同時,其大小恰好等於字串的大小,那麼就沒有地方儲存結束符『\0』,若是有指標引用這個字元陣列,那麼就有風險,因為編譯器直到遇到記憶體上順序最近的』\0『才會認為結束。rang6是沒有初始化的字元陣列,其值沒有,那麼編譯器會隨機賦乙個初值。個人建議每個字元陣列都要賦值,要是沒有就賦null也就是('\0')。

下面是對應程式printf後的值,可以和**值對應

不論是字元指標還是字元陣列,其初始化時用到的字串常量都存在rom或者flash這些非掉電丟失儲存器件中。字元指標和字元陣列本身是在ram區或者dram區。

執行的時候指標指向的字串常量所在的儲存位置,不搬運字串,看筆者**圖裡面的rang1就明白了,這裡面0x6001f99c對應flash區。執行的時候字元陣列對應的字串常量搬運到字元陣列對應的空間位置,同樣看rang2,這裡面0x8042f590對應sdram區。

字元指標、字元陣列都會用到strlen函式和sizeof操作符,這部分知識在此就不展開了。

不定長陣列 vector

使用需要包含標頭檔案 include vector是乙個模板類,所以需要用vectora或者vectorb這種方式宣告。vector的常用操作 int len a.size 返回vector長度 a.resize 100 把a長度變為100 a.push back 10 把10新增到尾部 a.pop...

不定長陣列 vector

vector是乙個不定長陣列模板類,所以需要用vectora或者vectorb這樣的方式來進行宣告乙個vector。vector是乙個類似於int a的整數陣列,而vector就是乙個類似於string a的字串陣列。使用vector時要加 include標頭檔案 常用的vector陣列的方法有 i...

STL vector 不定長陣列

包含在vector標頭檔案中 使用方式為 vector int vec 定義了乙個vec陣列 vector int vec 10 定義了元素數,各元素都為0 有 size 函式 返回陣列元素數,即陣列大小 resize 函式 重置陣列大小 push back argu 函式向後新增元素argu po...