C指標的實質

2021-05-22 23:24:05 字數 1914 閱讀 8719

最近對c/c++指標特別感冒,就詳細的研究了下

看下面的定義:

char a = "hello world";

char *p  = "hello world";

1.什麼是位址

位址本身就是一種基本資料型別,它跟整數,浮點數,字元等基本型別是一樣的。指標不是型別,真正的型別是位址,指標只不過是儲存位址這種資料型別的變數。

打個比方,對於

int i=10;

10是整數,而i是儲存整數的變數,指標就好比這個i,位址就好比那個10。指標能夠進行加減法,原因並不是因為它是指標,加減法則不是屬於指標這種變數的,而是位址這種資料型別的本能,正是因為位址具有加減的能力,所以才使指標作為存放位址的變數能夠進行加減運算。這跟整數變數因為整數能夠進行加減乘除因而它也能進行加減乘除乙個道理。

2.什麼是指標

指標本身就是乙個變數,它跟其他的變數是一樣的。指標本身是乙個符號。

比如 int *p,我們定義了乙個指標p,編譯器就會在記憶體分配乙個2(32位系統是4個位元組)位元組的儲存空間。我們在使用p的時候,p的值就是剛剛所分配的儲存空間中所存的內容。再來看看變數,我們定義int a = 10,a是乙個變數名。我們在使用a的時候,用的是a所對應的儲存空間的內容。a本身可以理解為就是乙個符號,它跟某個儲存空間相對應。&a就是取a所對應的儲存空間的位址。這樣,指標也是變數,本身也是乙個符號,在使用p的時候,我們使用的是p這個變數所對應的儲存空間的內容,而這個儲存空間的內容有些特別,它不是整數,也不是浮點數,而是乙個位址型別的資料。那麼&p是什麼意義呢,&p就是指p所對應的儲存空間的位址(這個位址可不是p所對應的儲存空間的內容哦)。那麼*p怎麼理解呢?記住在使用時,p的值是所對應的儲存空間的內容,那麼*p自然就是取出那個位址所對應的儲存空間的內容了。

3.什麼是陣列名

陣列名:就是乙個數,這個數和整數,浮點數類似,是乙個位址型別的資料。就像int a = 10;這裡的10就是乙個整數,它跟位址型別資料屬於乙個層次。也就是說陣列名跟整數10是相似的,而跟a差距大多了,根本不是乙個概念.應該說陣列名與&a是一樣的,都是乙個位址資料,同時陣列名還是乙個常量常量,位址常量。

用來存放陣列的區域是一塊在棧中靜態分配的記憶體(非static),而陣列名是這塊記憶體的代表,它被定義為這塊記憶體的首位址。這就說明了陣列名是乙個位址,而且,還是乙個不可修改的常量,完整地說,就是乙個位址常量。陣列名跟列舉常量類似,都屬於符號常量。陣列名這個符號,就代表了那塊記憶體的首位址。注意了!不是陣列名這個符號的值是那塊記憶體的首位址,而是陣列名這個符號本身就代表了首位址這個位址值,它就是這個位址,這就是陣列名屬於符號常量的意義所在。由於陣列名是一種符號常量,因此它是乙個右值,而指標,作為變數,卻是乙個左值,乙個右值永遠都不會是左值,那麼,陣列名永遠都不會是指標!

4.再來討論開頭我們所定義的字元陣列和字串指標的區別

我們假定這兩個定義是在同乙個函式中的(如main)。

繼續:*(a+1) =u;                        

*(p+1) = u

這裡第乙個操作會通過,而第二個操作則會出現段錯誤。這是什麼原因呢?那麼我們需要了解下,程式空間分配中儲存區問題。c/c++程式所對應的儲存區,分位三類

1.靜態儲存區:內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間 都存在。它主要存放靜態資料、全域性資料和常量。

2.棧區:在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束 時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

3.堆區:亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意大小的記憶體,程式設計師自己負責在適當的時候用free或delete釋放記憶體。

這裡char a = "hello world",其空間是分配在棧中的,所以你可以對其中的內容進行修改。而char *p = 「hello world」,其空間是分配在靜態儲存區的。且hello world為字串常量,是不允許修改的。

C指標的實質,對底層理解很有好處

最近對c c 指標特別感冒,就詳細的研究了下 看下面的定義 char a hello world char p hello world 1.什麼是位址 位址本身就是一種基本資料型別,它跟整數,浮點數,字元等基本型別是一樣的。指標不是型別,真正的型別是位址,指標只不過是儲存位址這種資料型別的變數。打個...

C 引用的實質理解

引用的定義 在型別和識別符號之間加上乙個取位址符,說明該識別符號為指定型別的引用 如 int ref num 就是ref是乙個int型的引用 引用有什麼作用呢?看下面 就知道了 第一行輸出 ref 12,num 12 第二行輸出 ref 16,num 16 第三行輸出 ref 18,num 18 由...

指標部分釋疑之一 指標的實質

指標部分釋疑 在學習c c 過程中,可能大多數學習者對指標都會產生厭煩乃至牴觸情緒。的確,對於初學者來講,指標是不好理解,也不好用,好多學習者喜歡採用不用指標的方式來解決問題,即 能不用指標就不用指標 甚至把指標當成了人人喊打的 goto 來看待 而其實,指標也是冤枉的,大家看到的都是指標的缺點,卻...