字符串的兩種定義方式
char數組
char sa[] = “hello world”;
char指針
char *sp = “hello world”;
這兩種方式都產生了一個”hello world”的字符串常量,字符串常量存儲在靜態存儲區中,靜態存儲區中的內容在程序運行的整個過程中都存在,而且只存儲一份。
數組與指針的關系
在第一種定義中,字符串常量在編譯時就已經分配好了空間,但直到運行時才會為數組分配存儲空間,這時,存儲在靜態存儲區中的字符串常量會被拷貝一份到數組中,此后,數組名sa與&sa[0]等價。重要的是,sa是一個常量,你不能修改sa的值,你可以通過sa+1來標識數組里的下一個元素,也可以修改數組里的元素。然而,sa++是不允許的,因為自增運算符只能作用于變量而不是常量。
第二種定義中,程序運行時只為指針變量sp分配了存儲空間,用來字符串常量”hello world”的地址,這時,字符串常量沒有被拷貝。sp的值是可以改變的,如++sp將指向字符e。
總之,數組初始化是從靜態存儲區中把一個字符串拷貝給數組,而指針初始化只是復制這個字符串的地址。
示例
#include
int main(int args, char **argv) {
char sa[] = "hello world";
char *sp = "hello world";
// sa++; 錯誤,sa是常量
sp++;
sa[1] = 'M';
*(sa+2) = 'X';
// sp[1] = 'M'; // 錯誤,不能修改常量值
printf("%s\n", sa);
}