字符數組是一種數組,這中數組中的每一個元素是一個字符型數據。數組
定義一個字符數組:函數
char ch[5];
對已定義的字符數組進行賦值:spa
ch[0] = 'h'; ch[1] = 'e'; ch[2] = 'l'; ch[3] = 'l'; ch[4] = 'o';
以上字符素組的存儲爲:指針
字符數組的初始化有兩種方式:code
char ch[5] = {'h','e','l','l','o'}; 或者 char ch[] = {'h','e','l','l','o'};
字符串與字符數組的區別在於,字符串在有效的字符後面添加一個結束標誌‘\0’。內存
'\0'字符的ASCII碼是0,系統在檢測到該字符的時候就認爲字符串已經結束了。字符串
#include <stdio.h> int main(void) { char ch[] = {'h','e','l','l','o','\0'}; //字符串初始化 printf("%s\n", ch); ch[3] = '\0'; //將第4個元素改爲結束符 printf("%s\n", ch); return 0; }
運行結果爲:io
上面的實例說明,printf()函數在打印字符串的時候並不檢測字符數組的大小,而是檢測須要打印的字符串是否有'\0'的結束標誌。C語言中和字符串有關的庫函數都是以遇到'\0'爲字符串操做結束標誌的。class
對一個字符串的初始化有兩種方式:程序
char str[] = {"hello"}; 或 char str[] = 「hello」;
須要注意的是字符串會添加一個結束符'\0'在字符串的結尾。
在C語言中使用兩個雙引號括起來的內容是一個字符串的常量,以下:
char *p = "hello world";
因爲一個字符串常量的值自己不會改變,所以這種字符串常量存儲在一個只讀的數據段中,任未嘗試對該數據段的修改都是不容許的,也能夠使用下面的方式定義字符串:
char str[] = "hello";
這種字符串是能夠修改的,這種定義實際上將存儲在制度數據段中的字符串的內容複製到了字符數組的空間中,所以這種方式等價於:
char *p = "hello"; char str[6]; strcpy(str, p);
來看下面的程序:
#include <stdio.h> int main(void) { char *str1 = "hello"; //字符串 char str2[] = "hello"; //字符數組 char *str3 = "hello"; //字符串 if(str1 == str2) printf("1 OK\n"); if(str1 == str3) printf("2 OK\n"); return 0; }
運行結果爲:
緣由是str1和str3指向同一個字符串常量,而該常量存儲在只讀數據段中,這時兩個指針實際上指向同一塊內存區域,所以指針的值是相等的。
而對於str2和str1來講,所指向的存儲空間的位置是不一樣的。str2是一個數組名,該數組存儲在棧上。而str1所指向的空間存儲在只讀數據段上,由此可知兩個指針誰不相等的。