C指標的實質

來源:互聯網
上載者:User

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

看下面的定義:

char a[] = "Hello World";

char *p  = "Hello World";

1.什麼是地址

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

打個比方,對於

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為字串常量,是不允許修改的。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。