7.3.1 修改內容
樣本7-3-1中,字元數組a的容量是6個字元,其內容為hello\0。a的內容可以改變,如a[0]= ‘X’。指標p指向常量字串“world”(位於靜態儲存區,內容為world\0),常量字串的內容是不可以被修改的。從文法上看,編譯器並不覺得語句p[0]= ‘X’有什麼不妥,但是該語句企圖修改常量字串的內容而導致運行錯誤。
char a[] = “hello”;
a[0] = ‘X’;
cout << a << endl;
char *p = “world”; // 注意p指向常量字串
p[0] = ‘X’; // 編譯器不能發現該錯誤
cout << p << endl;
樣本7-3-1 修改數組和指標的內容
7.3.2 內容複寫與比較
不能對數組名進行直接複製與比較。樣本7-3-2中,若想把數組a的內容複寫給數組b,不能用語句 b = a ,否則將產生編譯錯誤。應該用標準庫函數strcpy進行複製。同理,比較b和a的內容是否相同,不能用if(b==a) 來判斷,應該用標準庫函數strcmp進行比較。
語句p = a 並不能把a的內容複寫指標p,而是把a的地址賦給了p。要想複製a的內容,可以先用庫函數malloc為p申請一塊容量為strlen(a)+1個字元的記憶體,再用strcpy進行字串複製。同理,語句if(p==a) 比較的不是內容而是地址,應該用庫函數strcmp來比較。
// 數組…
char a[] = "hello";
char b[10];
strcpy(b, a); // 不能用 b = a;
if(strcmp(b, a) == 0) // 不能用 if (b == a)
…
// 指標…
int len = strlen(a);
char *p = (char *)malloc(sizeof(char)*(len+1));
strcpy(p,a); // 不要用 p = a;
if(strcmp(p, a) == 0) // 不要用 if (p == a)
…
樣本7-3-2 數組和指標的內容複寫與比較