天天看點

C語言字元串常量、字元數組、字元指針

最近被這幾個概念搞的頭暈目眩,貌似懂了,但沒完全懂。想通過了解的方式去搞清楚,而不是通過記性來記住。發現了一句萬能鑰匙,能解決大部分跟指針相關的概念問題:

指針存儲的是位址。

1、代碼

2、字元串常量

定義:用雙引号(“”)括起來的0個或者多個字元組成的序列

存儲:每個字元串尾自動加一個 ‘\0’ 作為字元串結束标志

字元串常量在記憶體的常量存儲區是按順序存儲的,如:

C語言字元串常量、字元數組、字元指針

 定義a時,存儲一個“123\0”;

 定義b時,判斷存儲區是否有"456\0",發現沒有則在後面追加"456\0";

 定義c時,判斷存儲區是否有"456\0",發現有,則不再存儲,此時b和c兩個指針存儲的都是"456\0"這片記憶體位址

既然是常量,那麼不可被修改,是以memcpy(b, a, 3);是錯誤的

3、字元數組

char a[] = "123";

首先聲明一個字元數組a,大小沒有确定,但是将一個字元串常量“123\0”指派給了a,故a的length就是4個位元組。【注意“123\0”并沒有存儲在常量區】

注意a歸根結底是一個數組,數組是一個變量,不是指針,雖然可把a當做一個指針,因為它指向數組的首位址,但歸根結底不是指針,指針存的是位址,變量存的是指...又暈了

正因為a是變量,是以a能夠修改其存儲的值。

a[0] = 'a';

4、字元指針

const char* b = "321";

既然名字是字元指針,那麼它一定是個指針,根據萬能鑰匙能夠得知,指針存儲的位址。

故解讀這句就是:

首先聲明一個字元指針b,然後定義一個字元串常量"321\0",字元串常量存儲在常量區,b存儲在棧區,b存儲的值是字元串常量"321\0"的位址。

這裡用到了const,在c語言裡不加const也行,c++裡不加會有個警告,但不影響編譯。但是建議加上const,能夠讓程式員一眼就知道此指針指向的是常量,也就是最終内容無法修改。

ps:

const type* p;

雖然最終指向不能修改,但是指針自身的取值,是可以修改的,即可修改指針指向的地方。

C語言字元串常量、字元數組、字元指針

5、記憶體圖

C語言字元串常量、字元數組、字元指針

ps:所有存儲類型代碼區、常量區、靜态區(全局區)、堆區、棧區,隻有棧是從高位址往低位址存儲,其他都是低位址往高位址存儲。

根據這個,列印一個棧變量位址是0x7******,大概能夠猜到此pc的記憶體條大小為8gb【純猜測未驗證】

長風破浪會有時,直挂雲帆濟滄海!