(三)C語言資料型別 指標型別

2021-10-19 08:08:32 字數 3531 閱讀 2679

(三)c語言資料型別——指標型別

指標是c語言的特色之一,熟練掌握和正確使用指針對乙個成功的c語言程式設計人員來說是十分重要的。正確靈活地運用指標,可以使程式編寫簡潔、緊湊、高效。利用指標變數可以有效地表示各種複雜的資料結構,如佇列、棧、鍊錶、樹、圖等。

一.指標的概念

1.變數的位址與變數的內容

在計算機中,所有的資料都是以二進位制形式存放在記憶體儲器中。一般把記憶體中的乙個位元組成為乙個記憶體單元,不同的資料型別所占用的記憶體單元數不等。為了正確地訪問這些記憶體單元,必須為每個記憶體單元編號。根據乙個記憶體單元的編號即可準確地找到該記憶體單元所在位置,記憶體單元的編號叫做記憶體位址。

c語言中的每個變數在記憶體中都要占有一定位元組數的儲存單元,c編譯系統在對程式編譯時會自動根據程式中定義的變數型別在記憶體中為其分配相應位元組數的儲存空間,用來存放變數的數值。變數在記憶體單元中存放的資料,成為變數的內容,而把存放該資料所佔的儲存單元位置(即記憶體位址),稱為變數的位址。

例如:當編譯系統讀到說明語句**「short a=9;」**時則給變數a分配兩個位元組(即兩個儲存單元)的記憶體空間;

**「double c;」**只是為變數c定義了雙精度實數型別,沒有給變數賦予處置,編譯系統僅為該變數分配了對應的8個位元組的記憶體空間,等待在程式執行過程中隨機存放資料。

2.直接訪問(定址)與間接訪問(定址)

程式中欲對變數進行操作時,可以直接通過變數位址對其儲存單元進行訪問操作,把這種按變數位址訪問變數的方式成為「直接訪問(定址)」方式。通常情況下,只需要使用變數名就可以直接引用該變數在儲存單元中的內容。

例如,編譯程式為變數a分配了位址從0x6000到0x6001的兩個位元組儲存單元並賦予初值9,變數名a的儲存單元首位址是0x6000;那麼a就代表變數的內容9。

如果變數a的記憶體位址存放在另乙個變數p中,為了訪問變數a,就必須通過先訪問變數p獲得變數a的首位址0x6000後,即經過變數p"中介",再到相應的位址中去訪問變數a並得到a的值。把這種間接地得到變數a的值的方法稱為「間接訪問(定址)」方式。

這個專門用來存放記憶體位址資料的中介變數p,就是下面要介紹的指標型別變數,簡稱為指標變數 。

3.指標和指標變數

通過對記憶體單元「間接訪問」的概念可知,通過儲存單元位址可以找到所需要的變數單元,即該位址「指向」某個變數所在的記憶體單元。因此在c語言中,將乙個變數的位址形象地稱為該變數的「指標」,如上例中的變數p就是記憶體變數a的指標變數。

「指標」是乙個位址,變數的指標就是變數的位址。存放指向位址的變數叫做「指標變數」。「指標」和「指標變數」實際上是兩個不同的概念。存放變數a的內容的儲存單元首位址0x6000是變數a的「指標」,而存放變數a"指標"的變數p才叫「指標變數」。

4.指標變數的資料型別

指標變數是用來存放儲存單元位址的,所以指標變數的資料型別並不代表指標變數本身的資料型別,而是它所指向的目標變數的資料型別。因此,目標變數的資料型別決定了指標變數的資料型別。

由於各種型別的資料在記憶體單元中佔據的空間是不同的,所以指標變數只能是指向某個變數的儲存單元的首位址,而不能隨便指向該空間的其他位址。

乙個指標變數+1運算後,會一次性跳過所指向的目標變數的型別所占用的全部單元,這個「步長」根據資料型別是可變的。

5.使用指標變數應注意的原則

(1)指標變數使用前必須明確其指向,否則會帶來歧義;

(2)乙個型別的指標變數只能用來指向同一資料型別的目標變數,而且必須指向目標變數所在儲存單元空間的首位址;

(3)指標變數指向陣列元素時,要注意防止陣列下標出界;

(4)分析程式時要特別注意指標變數當前的值,尤其是指標變數運算後當前的值。

二.指標變數的定義

指標變數定義的一般形式為:

*[型別修飾符] 資料型別 變數名列表

例如:int i,j;

int *p1,*p2;

定義了兩個整型變數i、j和兩個指向整型變數的指標變數p1、p2。

可以分別使每個指標變數指向乙個整型變數,如:

p1=&i ;

p2=&j ;

指標變數名遵循識別符號的命名規則。

說明:(1)變數名前的號代表該變數是指標變數,以上定義的p1和p2是指標變數,而不是說p1和*p2是指標變數。

(2)指標變數的型別絕不是指標變數本身的型別,不管是整型、實型,還是字元型變數,它們都是用來存放位址的,所以指標變數就其本身來說沒有型別之分,這裡所說的型別是指它指向的目標變數的資料型別。乙個型別的指標變數只能用來指向統一資料型別的目標變數,例如乙個整型的指標變數只能指向整型變數而不能指向其他型別的變數。就是說,只有同一型別變數的位址才能存放到指向該型別變數的指標變數中。

例如:int *p;

char *str;

float *q;

其中,p是指向整型資料的變數;str是指向字元型資料的指標變數;q是指向實型資料的指標變數。

(3)同一儲存屬性和統一資料型別的變數變數、陣列、指標等可以在一行中定義。

2.指標變數的初始化

給指標變數賦予初值的過程稱為指標變數的初始化。指標變數在定義的同時也可以進行初始化。

例如:int *p=&a;

說明:

(1)「 * 」只表示其後面跟的識別符號是個指標變數。「 & 」表示取位址符。取出變數的位址給指標變數賦值。

(2)把乙個變數的位址作為初始值賦予指標變數時。該變數必須在此之前已經被定義過,因為變數只有在定義後才被分配儲存單元。

(3)指標變數定義時的資料型別必須和它所指向的目標變數的資料型別一致。

(4)可以用初始化了的指標變數給另乙個指標變數進行初始化賦值。例如:

int x;

int *p=&x;

int *q=p; /用已經賦值的指標變數p給另乙個指標變數q賦值

(5)不能用數值作為指標變數的初值,但可以將乙個指標變數初始化為乙個空指標。例如:

int *p=6000; /非法

int *p=0; /合法。代表將p初始化為空指標,「0」代表null的ascii字元

3.指標變數的引用

關於指標變數的引用,通過上述已經出現的兩個相關運算子進行說明。

(1)*:稱為指標運算子或稱為「間接訪問記憶體位址」運算子;在定義時,通過它表明某個變數被定義為指標變數,而在使用時,*p則表示p所指向的變數的內容。

(2)&:稱為取位址運算子,通過它獲得目標變數所在儲存單元的位址。

例:

#include

void

main()

該程式執行結果為:

100,10

100,

10

三 C語言資料型別 01基本資料型別 浮點型別

型別說明 float 必須至少能夠表示6位有效數字,且取值範圍至少是10 37 次方 10 37 次方 一般佔32位,8位表示指數的值和符號,剩下24位表示非指數部分 也叫作尾數或有效數 及其符號。double 必須至少能夠表示10位有效數字 一般佔64位,多出的32位全部用來表示非指數部分。lon...

三 C語言資料型別 01基本資料型別 整數型別

型別 簡寫 說明int 有符號整型,ios c規定int的取值範圍最小為 32768 32767 一般佔16位或32位 short int short 占用儲存空間不能多於int型別,有符號整型 一般佔16位 long int long 占用儲存空間不能少於int型別,有符號整型 一般佔32位 lo...

學點 C 語言 20 資料型別 指標

include int main void 2.表示變數位址的變數就是指標 include int main void 3.指標 就如同變數本身是一樣的 include int main void 4.宣告指標時要注意初始化,沒有初始化的指標是危險的 include int main void 5....