C語言->字符指針學習筆記

字符串常量是一個字符數組,例如:

"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的內容沒有變化,只是沒有指針指向它了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章