注意char *a="abcdef"與char a="abcdef"的區別:1、字串存放的記憶體區域不同:前者存放在常量區,不可修改,後則存放在棧中,可以修改;2、變數a存放的內容不同:前者存放的是乙個位址,而後者存放的是字串"abcdef",因此使用sizeof它們的結果是不同的,分別是4和7;
c 是靜態弱型別語言。意味著型別(包括 size 等資訊,你使用 sizeof 就是編譯時候得到的)在編譯的時候就能確定下來。
它的原生簡單型別有 char int float 這樣的,原生復合型別有 struct,以及「偉大」的 指標型別 primitive_type * .
這些型別的設計是在編譯時可以明確確定儲存空間大小,比如 char 佔乙個位元組。32bit 機器上的指標為 4 bytes.
所謂的 string 型別,它的大小不能在編譯的時候確定下來,因為你將儲存 string 的長度不是固定的,可大可小。你說編譯器給 string 分配多少合適?
所以在 c 中 string 只能以復合型別存在,一般用 struct 包含乙個指標型別和乙個表示儲存空間大小的整數型別。
你見到的其他語言的 string 也並非它最基本的型別。只不過作為標準庫提供出來了,方便使用。c 不屑於幹這事 —— 因為它有「偉大」的指標。
1、字元陣列的定義與初始化
字元陣列的初始化,最容易理解的方式就是逐個字元賦給陣列中各元素。
char str[10]=;
即把10個字元分別賦給str[0]到str[9]10個元素
如果花括號中提供的字元個數大於陣列長度,則按語法錯誤處理;若小於陣列長度,則只將這些字元陣列中前面那些元素,其餘的元素自動定為空字元(即 '\0' )。
2、字元陣列與字串
在c語言中,將字串作為字元陣列來處理。(c++中不是)
在實際應用中人們關心的是有效字串的長度而不是字元陣列的長度,例如,定義乙個字元陣列長度為100,而實際有效字元只有40個,為了測定字串的實際長度,c語言規定了乙個「字串結束標誌」,以字元'\0'代表。如果有乙個字串,其中第10個字元為'\0',則此字串的有效字元為9個。也就是說,在遇到第乙個字元'\0'時,表示字串結束,由它前面的字元組成字串。
系統對字串注意:陣列str的長度不是10,而是11,這點請務必記住,因為字串
3、字串的表示形式
在c語言中,可以用兩種方法表示和存放字串:
(1)用字元陣列存放乙個字串
char str[ ]="i love china";
(2)用字元指標指向乙個字串
char* str="i love china";
對於第二種表示方法,有人認為str是乙個字串變數,以為定義時把字串常量"i love china"直接賦給該字串變數,這是不對的。
c語言對字串常量是按字元陣列處理的,在記憶體中開闢了乙個字元陣列用來存放字串常量,程式在定義字串指標變數str時只是把字串首位址(即存放字串的字元陣列的首位址)賦給str。
兩種表示方式的字串輸出都用
printf("%s\n",str);
%s表示輸出乙個字串,給出字元指標變數名str(對於第一種表示方法,字元陣列名即是字元陣列的首位址,與第二種中的指標意義是一致的),則系統先輸出它所指向的乙個字元資料,然後自動使str自動加1,使之指向下乙個字元...,如此,直到遇到字串結束識別符號 " \0 "。
4、對使用字元指標變數和字元陣列兩種方法表示字串的討論
雖然用字元陣列和字元指標變數都能實現字串的儲存和運算,但它們二者之間是有區別的,不應混為一談。
4.1、字元陣列由若干個元素組成,每個元素放乙個字元;而字元指標變數中存放的是位址(字串/字元陣列的首位址),絕不是將字串放到字元指標變數中(是字串首位址)
4.2、賦值方式:
對字元陣列只能對各個元素賦值,不能用以下方法對字元陣列賦值
char str[14];
str="i love china"; (但在字元陣列初始化時可以,即char str[14]="i love china";)
而對字元指標變數,採用下面方法賦值:
char* a;
a="i love china";
或者是 char* a="i love china"; 都可以
4.3、對字元指標變數賦初值(初始化):
char* a="i love china";
等價於:
char* a;
a="i love china";
而對於字元陣列的初始化
char str[14]="i love china";
不能等價於:
char str[14];
str="i love china"; (這種不是初始化,而是賦值,而對陣列這樣賦值是不對的)
4.4、如果定義了乙個字元陣列,那麼它有確定的記憶體位址;而定義乙個字元指標變數時,它並未指向某個確定的字元資料,並且可以多次賦值。
5、字串處理函式
5.1
char *strcat(char *str1,const char *2 );
char *strcat(char *strdestination,const char *strsource );
功能:函式將字串str2 連線到str1的末端,並返回指標str1
注:連線前兩個字串的後面都有乙個' \0 ',連線時將字串1後面的 ' \0 『去掉,只在新串最後保留乙個 ' \0 『
5.2char *strcpy(char *str1,const char *2 );
char *strcpy(char *strdestination,const char *strsource );
功能:複製字串strsource中的字元到字串strdestination,包括空值結束符。返回值為指標strdestination。
注:1、「字元陣列1」必須寫成陣列名形式,「字串2"可以是字元陣列名,也可以是乙個字串常量
2、複製時連同字串後面的 ' \0 ' 一起複製到陣列1中
3、不能用賦值語句直接將乙個字串常量或者字元陣列直接賦給乙個字元陣列(同普通變數陣列是一樣的),而只能用strcpy函式處理。
4、可以用strcpy函式將字串2中的前若干個字元複製到字元陣列1中去。
C語言之陣列 字串
陣列 一 陣列的定義和賦值 int ages 5 每個元素佔4個位元組,整個陣列的大小為4 元素個數5 int ages 定義陣列可以不宣告長度,後邊大括號裡的元素個數決定陣列的長度 int ages a a 65,所以這個陣列的長度為65 ages 0 29 為某乙個元素賦值或替換 二 陣列的遍歷...
C語言之陣列和字串
陣列的使用 對一維陣列的輸入 int a 5 i 陣列必須先定義後使用,且在定義時,必須指定陣列的長度。比如這裡不能這樣 int a.for i 0 i 5 i scanf d a i 這裡i 5是給他限定輸入資料個數的範圍,也就是當輸入這麼多資料後,系統不再接收資料 由於陣列元素儲存型別為int,...
C語言之字串
字元就是符號 圖案,在計算機中以整數形式儲存,當需要顯示時會根據ascii表中的對應關係,顯示相應的符號或圖案。字元型別 char 的資料 如字元a,a,0,等 在記憶體中以對應的ascii碼存放,不同字元所對應的ascii碼見下表。計算機用乙個位元組 8個二進位制位 儲存乙個字元,例如,字元a的a...