最近被這幾個概念搞的頭暈目眩,貌似懂了,但沒完全懂。想通過了解的方式去搞清楚,而不是通過記性來記住。發現了一句萬能鑰匙,能解決大部分跟指針相關的概念問題:
指針存儲的是位址。
1、代碼
2、字元串常量
定義:用雙引号(“”)括起來的0個或者多個字元組成的序列
存儲:每個字元串尾自動加一個 ‘\0’ 作為字元串結束标志
字元串常量在記憶體的常量存儲區是按順序存儲的,如:
定義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;
雖然最終指向不能修改,但是指針自身的取值,是可以修改的,即可修改指針指向的地方。
5、記憶體圖
ps:所有存儲類型代碼區、常量區、靜态區(全局區)、堆區、棧區,隻有棧是從高位址往低位址存儲,其他都是低位址往高位址存儲。
根據這個,列印一個棧變量位址是0x7******,大概能夠猜到此pc的記憶體條大小為8gb【純猜測未驗證】
長風破浪會有時,直挂雲帆濟滄海!