c 雜談之 指標與陣列 (一)
思維導圖
介紹 1>
指標定義:指標是儲存變數位址的變數。
2> 本文重點
>> 指標與
陣列之間的關係
>> 操縱指標的規則
3> 指標優點
>> 表達某個計算的唯一途徑
>> **更高效,更緊湊
4> 指標缺點:難以理解,但是用好了,**會非常清晰。
5> 將指標、陣列和位址的算術運算整合在一起是c語言的一大優點。
指標與位址
1> 記憶體組織方式
(1) 記憶體是乙個個單元組成的,每乙個記憶體單元中存放乙個位元組(8位)的二進位制資訊。
(2) 機器中的記憶體單元是有序排列的。
(3) 機器給各個記憶體單元規定不同位址來管理記憶體。這樣,cpu通過位址來識別不同的記憶體單元,正確的對記憶體單元進行操作。
2> 指標與變數的關係(p:是指標變數,c:記憶體物件)
>>> p:儲存c:中的單元首位址——這裡的位址不是實體地址,而是經過位址對映後的虛擬位址,即邏輯位址。
>>> p:為指向c:的指標
3>理解指標
>>> 指標占用的記憶體空間大小: 32位系統占用4byte,64為8byte。
機器配置:
列印指標大小:
>>> 指標就是位址——我們可以把指標認為是用來存放位址的資料型別。不能把指標簡簡單單的當成乙個整型數,雖然位址的值是乙個整型資料。
>>> 指標是有型別的,但是這個型別不是給指標分配記憶體的,而是用來定址的。
指標與函式引數
1.普通引數:c語言通過傳值方式將值傳遞給被呼叫函式。
>> 會把變數的值複製乙份給被呼叫函式。
>> 複製:會把變數的值賦值給乙個新的變數(引數)——變數和新的變數必須有相同的儲存容量。
>> 被呼叫函式並不能修改主調程式中的變數值,因為被呼叫函式使用的是乙個複製過來的記憶體單元。
2.指標引數: 本質上跟普通引數傳遞是相同的,也進行了變數複製,但是傳過去的值是位址。 被呼叫函式通過位址能夠訪問和修改主調程式中變數的值。
3.引數在記憶體消耗
普通引數:取決於申明型別。char:1個位元組;short:2個位元組;long:8個位元組
指標引數:指標變數裡儲存的是位址(一般是4個位元組——32位),永遠是乙個固定長度,不管是什麼型別的指標。——除非處理器變化不是32位。
4.double *dp, atof(char *) 這裡的dp是指標變數,而atof是函式
指標與陣列
1.指標運算元組快於下標運算元組
2.陣列的空間分配.如int a[10];——會在空間分配出40個相鄰的記憶體單元來(10*4)。
3.指標運算元組
int *pa;
pa = &a[0];
4.指標移動
int *pa;pa+1將指向下乙個元素a[1]:int a[10];
pa = &a[0];
>> 記憶體中的變化:"指標加1"會根據指標指定的型別int移動4個記憶體單元,其實本身並沒有移動,只是pa+1等於第5個記憶體單元位址——「指標加1」中的1的大小是取決於pa的型別int的,
指標型別決定指標跨記憶體單元的步長。
>> pa+1 等於是指向第5個記憶體單元——a[1]的第乙個記憶體單元。
5.規則:
>> &a[i]和a+i含義相同,相互使用。a+i是a之後第i個元素位址。
>> 陣列名代表陣列第乙個元素的位址。
位址運算子
1. 指標初始化:0或表示位址的表示式。
2. 「指標加1」中的「1」的大小根據資料型別的長度按比例縮放。如果int型別佔4個位元組的儲存空間,對應的1按4倍計算。
驗證:
>>> 若指向char型別的指標p的記憶體位址是0x000000,那麼p+1後的位址是0x000001。
驗證過程如下:
執行結果:
>>> 若指向int 型別的指標p的記憶體位址是0x000000,那麼p+1後的位址是0x000004。
執行結果:
3.指向不同陣列的元素的指標之間的算術或比較運算都沒有定義。
4.指標相減:如果p和q指向相同陣列中的元素,且p**驗證:
執行結果:
流程變化:q-p=16 => 16/4=4 (按照int型所佔記憶體單元等比例縮放) => 4 + 1 = 5;
總結
這次寫關於c語言方面指標,是因為這兩天看php核心檔案的時候,由於c方面的欠缺,所以看著很吃力。所以想再複習下c語言。
為什麼從指標入手呢?可能是因為指標在c語言中是比較難的。所以先把最難的啃下來。
本來是想一次性寫完,可是指標這方面內容太多,所以決定分幾批寫。
我在c語言方面還是很薄弱,如果文章中有錯誤,希望高手們指點下。
我知道c方面高手非常多,我在c方面屬於菜鳥級別的,沒有任何開發經驗,所以希望高手們能多指點下!
參考文獻:《c程式語言》
c 雜談之 指標與陣列 (一)
C 雜談 C 指標
1.何為指標 程式執行時,任何變數都是存放在記憶體中的,通過將記憶體以位元組的大小劃分,為每個位元組增添索引,某一變數的位址就是該變數在記憶體中所佔的第乙個位元組的索引。此時,定義一變數用來存放開始第乙個位元組的索引,這個變數就被稱為指標,通過該變數的值可以間接的訪問該指標所指向的變數。在32位系統...
C 之字元指標陣列與整數指標陣列
include using namespace std const int max 4 int main for int i 0 i max i return 0 結果 names i zara ali names i z names i 1 91 char names i 1 names i hi...
c之指標與陣列(1)
1.指標與位址 一元運算子 是間接定址或者間接引用運算子。例如 int x 1,y int ip ip x y ip 2.指標與函式引數 c語言是以傳值的方式將引數值傳遞給被呼叫函式,因此被呼叫函式不能直接修改主調函式中變數的值。例如 void swap int x,int y swap不能交換兩個...