1. 程式人生 > >C語言基礎複習筆記(一)指標

C語言基礎複習筆記(一)指標

最近linux很火,年前對linux再詳細瞭解了個大概,結合在windows平臺活躍與強大無比的C++,最終得出一個結論:C語言依然強大。

過年回來,便對的C語言充滿了興趣,於是乎去網上下載了教程回來,細細研讀,基礎程式設計思想始終是很重要的。

首先,入手的便是C語言的核心精華部分,指標。要理解指標就要一步步理解下面的點:

1.       我們所使用的記憶體單元在物理上線性的,所以記憶體地址也是一系列連續的,每個記憶體單元都有一個固定的,不會被修改的地址。

2.      

定義一個變數,編譯系統就會為該變數分配相應的記憶體單元,這就意味著每個變數在記憶體都會有固定的、具體的地址,當然資料型別不同的變數所佔據的記憶體單元數目也不相同。

3.       一個地址唯一指向一個記憶體變數,這個地址就是指標,然後用來存放這個地址的變數就是指標變量了。指標變數其實也就是一個變數,用了儲存地址作用的。

設一組指標變數p ap bp xp yp mp c h 1p c h 2,分別指向上述的變數 abxymc h 1c h 2,指標變數也同樣被存放在記憶體,二者的關係如圖 6 - 2所示:

 

4.       關於運算子:

&運算子:取地址運算子,&m即是變數m的地址。

*運算子:指標運算子,*pa即是表示其所指向的變數。

Int *pa;

Float *pb;

Char *px;

定義了3個指標變數,pa指向了一個整型變數,pb指向了一個實型變數,px指向了一個字元型變數。也就是說,papbpx分別存放了整型變數、實型變數、字元型變數的地址。

Int m=3 ;

Float f=4.5 ;

Ch=’a’ ;

我們進行操作:

Pa=&m;

Pb=&f;

Px=&ch;

上述操作表示,將變數m的地址賦給指標變數pa;將變數f的地址賦給指標變數pb;將變數ch的地址賦給指標變數px

*指標變數,其含義是指標變數所指向的值。

p=&a;  則稱p指向變數a,或者說p具有了變數a的地址。

在以後的程式處理中,凡是可以寫& a的地方,就可以替換成指標的表示pa就可以替換成為* p

 

指標與陣列

 

1.       定義一維陣列,在記憶體也有系統分配的儲存空間,陣列名就是陣列在記憶體的首地址(a[10]a

2.       陣列名陣列的首地址,也就是陣列的指標。

3.       定義一個指標變數,並將陣列的首址傳給指標變數,則該指標就指向了這個一維陣列。

int  a[10] ;  

int  *ptr ;          /* 定義陣列與指標變數*/

做賦值操作:ptr=a; p t r = & a [ 0 ] ;

a是陣列的首地址,&a[0]是陣列元素a[0]的記憶體地址,a[0]地址就是陣列的首地址

1)       ptr+na + n表示陣列元素a [ n ]的地址,即&a[n]

2)       * ( p t r + n )* ( a + n)就表示為陣列的各元素即等效於a [ n ]

4.       指向陣列的指標變數也可用陣列的下標形式表示為 p t r [ n ],其效果相當於* ( p t r + n )

5.       *ptr++所表示的意義。

*ptr表示指標所指向的變數;ptr ++表示指標所指向的變數地址加1個變數所佔位元組數。

指向整型變數,則指標值加 2,若指向實型,則加4,依此類推。

 

 

指標與二維陣列

定義一個二維陣列:int a[3][4];

其中a是二維陣列的首地址, & a [ 0 ] [ 0 ]既可以看作陣列00列的首地址,同樣還可以看作是二維陣列的首地址,a [ 0 ]是第0行的首地址,當然也是陣列的首地址。

我們就可以把二維陣列看成是由 n行一維陣列構成,將每行的首地址傳遞給指標變數,行中的其餘元素均可以由指標來表示。

對指標法而言,程式可以把二維陣列看作展開的一維陣列: