字符串字面值也可以像數組名一樣使用,可以加下標訪問其中的字符:
正確:
char c = "Hello, world.\n"[0];
但是通過下標修改其中的字符卻是不允許的:
錯誤:
"Hello, world.\n"[0] = 'A';
字符串字面值是隻讀的,不允許修改。字符串字面值還有一點和數組名類似,做右值使用時自動轉換成指向首元素的指針。
正確:
char str[10] = "Hello";
等價於:
char str[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };
所以
正確:
const char *p = "abcd";
const char str1[5] = "abcd";
char str2[5] = "abcd";
printf(p);
printf(str1);
printf(str2);
printf("abcd");
錯誤:
char *p = "abcd";
p[0] = 'A';
編譯時候:
char p = “abcd”;
warning: ISO C++ forbids converting a string constant to ‘char’
運行時候:
段錯誤 (核心已轉儲)!!!
正確:
char *p
char s[] = "abcd";
p = s;
s[0] = 'A';
p[0] = 'A';
字符串”abcd”在常量區中就是一個以’\0’結尾的字符數組,當將此數組賦值給指針 p 時,該數組會被視爲其首字符’a’的地址,因此 p 就存儲了’a’的地址,表現爲指向了以該字符爲首的字符串。而當我們將此數組當做初始值賦給 s 時,實際上就是兩個數組的對拷,拷貝完之後數組 s 裏面就是跟常量區數組一樣的一個字符串。
char *p = "abcd";
和char s[] = "abcd";
結尾都有一個'\0'
!
錯誤:
char *p = {'1','2','3'};