字符串常量是一個字符數組,例如:
"abc123abc"
在字符串的內部表示中,字符數組以空字符'\0'結尾,所以
1.程序可以通過檢查空字符找到字符數組的結尾;
2.字符串常量佔據的存儲單元數也因此比雙引號內的字符數大1;
3.當類似於這樣一個字符串出現在程序中時,實際上是通過字符指針訪問
該字符串的,也就是說,字符常量可通過一個指向其第一個元素的指針來訪問。
我們寫一段代碼:
#include <stdio.h>
int main() {
char *p="abc123abc";
char q[]="abc123abc";
char r[3]="abc";
char s[4]="abc";
printf(p);
printf("abc\n");
return 0;
}
我們看第一句:char *p="abc123abc";
這個語句,將把一個指向該字符數組的指針複製給p。該過程沒有進行字符串的複製:
1.而只是涉及到指針的操作;
2.C語言沒有提供將整個字符串作爲一個整體處理的運算符。
在調試過程中,我們看一下內存:
我們看一下p的運行內存
借鑑右側的內容,我們看一下左側的數字(16進制)
我們可以看到,abc123abc 在內存中的表示爲 61 62 63 31 32 33 61 62 63 00
其中00代表結束,即'\0';
我們把這幾個十六進制轉換成ascii看看內容是啥
61->01100001(2進制)->97(10進制)->a的ascii碼
62->01100010(2進制)->98(10進制)->b的ascii碼
63->01100011(2進制)->99(10進制)->c的ascii碼
31->00110001(2進制)->49(10進制)->1的ascii碼
32->00110010(2進制)->50(10進制)->2的ascii碼
33->00110011(2進制)->51(10進制)->3的ascii碼
我們再看一下:char s[4]="abc";
q是一個足以存放初始化字符串及空字符'\0'的一位數組,我們看一下內存:
數組中的單個字符可以進行修改,但是q始終指向同一個存儲位置
比如說,我可以這樣寫q[2]='a';
我們可以看出,單個字符可以進行修改,但是q始終指向同一個存儲位置
如果我們故意將數組長度設置的不足存放末尾的'\0',會有啥現象?
r的值後面多了9c和0f 爲啥?因爲0f後面有'\0'
如果將其輸出 結果是abc\234
仔細看看?
9C (16進制)->10011100(2進制)->92(10進制)->'\'的asci碼
0F (16進制)->00001111(2進制)-》15(10進制)???
這個234不知道從何處得來
p是一個指針,它可以被修改以指向其它地址,如果試圖修改字符串的內容,結果無意義。
比如說:
char *p="abc123abc";
int x=10;
p="ABC";
在執行到x=10這句話的時候,我們看一下p
內存地址是100000F98
當執行完p="ABC";之後
指針P指向的地址發生了變化,指向了10000F94,而不是10000F98的內容變了
那麼 10000F98的怎麼樣了?
我們看看
因爲一個如“41”這種16進制數佔一個字節,那麼四個字節之後呢?
10000F98內容是 61 即a
結合右側的內容我們也發現,之前p指向的地址10000F98的內容沒有變化,只是沒有指針指向它了。