當前位置:才華齋>計算機>C語言>

如何理解C語言指標

C語言 閱讀(1.35W)

指標是C語言中廣泛使用的一種資料型別。 運用指標程式設計是C語言最主要的風格之一。利用指標變數可以表示各種資料結構; 能很方便地使用陣列和字串; 並能象組合語言一樣處理記憶體地址,從而編出精練而高效的程式。指標極大地豐富了C語言的功能。 學習指標是學習C語言中最重要的一環, 能否正確理解和使用指標是我們是否掌握C語言的一個標誌。同時, 指標也是C語言中最為困難的一部分,在學習中除了要正確理解基本概念,還必須要多程式設計,上機除錯。只要作到這些,指標也是不難掌握的。以下是小編為大家搜尋整理的如何理解C語言指標,歡迎大家閱讀!更多精彩內容請及時關注我們應屆畢業生考試網!

如何理解C語言指標

指標的基本概念 在計算機中,所有的資料都是存放在儲存器中的。 一般把儲存器中的一個位元組稱為一個記憶體單元, 不同的資料型別所佔用的記憶體單元數不等,如整型量佔2個單元,字元量佔1個單元等, 在第二章中已有詳細的介紹。為了正確地訪問這些記憶體單元, 必須為每個記憶體單元編上號。 根據一個記憶體單元的編號即可準確地找到該記憶體單元。記憶體單元的編號也叫做地址。 既然根據記憶體單元的編號或地址就可以找到所需的記憶體單元,所以通常也把這個地址稱為指標。 記憶體單元的指標和記憶體單元的內容是兩個不同的概念。 可以用一個通俗的例子來說明它們之間的關係。我們到銀行去存取款時, 銀行工作人員將根據我們的帳號去找我們的存款單, 找到之後在存單上寫入存款、取款的金額。在這裡,帳號就是存單的指標, 存款數是存單的內容。對於一個記憶體單元來說,單元的地址即為指標, 其中存放的資料才是該單元的內容。在C語言中, 允許用一個變數來存放指標,這種變數稱為指標變數。因此, 一個指標變數的值就是某個記憶體單元的地址或稱為某記憶體單元的指標。圖中,設有字元變數C,其內容為“K”(ASCII碼為十進位制數 75),C佔用了011A號單元(地址用十六進數表示)。設有指標變數P,內容為011A, 這種情況我們稱為P指向變數C,或說P是指向變數C的指標。 嚴格地說,一個指標是一個地址, 是一個常量。而一個指標變數卻可以被賦予不同的指標值,是變。 但在常把指標變數簡稱為指標。為了避免混淆,我們中約定:“指標”是指地址, 是常量,“指標變數”是指取值為地址的變數。 定義指標的目的是為了通過指標去訪問記憶體單元。

既然指標變數的值是一個地址, 那麼這個地址不僅可以是變數的地址, 也可以是其它資料結構的地址。在一個指標變數中存放一

個數組或一個函式的首地址有何意義呢? 因為陣列或函式都是連續存放的。通過訪問指標變數取得了陣列或函式的首地址, 也就找到了該陣列或函式。這樣一來, 凡是出現數組,函式的地方都可以用一個指標變數來表示, 只要該指標變數中賦予陣列或函式的首地址即可。這樣做, 將會使程式的概念十分清楚,程式本身也精練,高效。在C語言中, 一種資料型別或資料結構往往都佔有一組連續的記憶體單元。 用“地址”這個概念並不能很好地描述一種資料型別或資料結構, 而“指標”雖然實際上也是一個地址,但它卻是一個數據結構的首地址, 它是“指向”一個數據結構的,因而概念更為清楚,表示更為明確。 這也是引入“指標”概念的一個重要原因。

指標變數的型別說明

對指標變數的型別說明包括三個內容:

(1)指標型別說明,即定義變數為一個指標變數;

(2)指標變數名;

(3)變數值(指標)所指向的變數的資料型別。

其一般形式為: 型別說明符 *變數名;

其中,*表示這是一個指標變數,變數名即為定義的指標變數名,型別說明符表示本指標變數所指向的變數的資料型別。

例如: int *p1;表示p1是一個指標變數,它的值是某個整型變數的地址。 或者說p1指向一個整型變數。至於p1究竟指向哪一個整型變數, 應由向p1賦予的地址來決定。

再如:

staic int *p2; /*p2是指向靜態整型變數的指標變數*/

float *p3; /*p3是指向浮點變數的指標變數*/

char *p4; /*p4是指向字元變數的指標變數*/ 應該注意的是,一個指標變數只能指向同類型的變數,如P3 只能指向浮點變數,不能時而指向一個浮點變數, 時而又指向一個字元變數。

指標變數的賦值

指標變數同普通變數一樣,使用之前不僅要定義說明, 而且必須賦予具體的值。未經賦值的指標變數不能使用, 否則將造成系統混亂,甚至宕機。指標變數的賦值只能賦予地址, 決不能賦予任何其它資料,否則將引起錯誤。在C語言中, 變數的地址是由編譯系統分配的,對使用者完全透明,使用者不知道變數的具體地址。 C語言中提供了地址運算子&來表示變數的地址。其一般形式為: & 變數名; 如&a變示變數a的地址,&b表示變數b的地址。 變數本身必須預先說明。設有指向整型變數的指標變數p,如要把整型變數a 的地址賦予p可以有以下兩種方式:

(1)指標變數初始化的方法 int a;

int *p=&a;

(2)賦值語句的方法 int a;

int *p;

p=&a;

不允許把一個數賦予指標變數,故下面的賦值是錯誤的: int *p;p=1000; 被賦值的指標變數前不能再加“*”說明符,如寫為*p=&a 也是錯誤的

指標變數的運算

指標變數可以進行某些運算,但其運算的種類是有限的。 它只能進行賦值運算和部分算術運算及關係運算。

1.指標運算子

(1)取地址運算子&

取地址運算子&是單目運算子,其結合性為自右至左,其功能是取變數的地址。在scanf函式及前面介紹指標變數賦值中,我們已經瞭解並使用了&運算子。

(2)取內容運算子*

取內容運算子*是單目運算子,其結合性為自右至左,用來表示指標變數所指的變數。在*運算子之後跟的變數必須是指標變數。需要注意的是指標運算子*和指標變數說明中的指標說明符* 不是一回事。在指標變數說明中,“*”是型別說明符,表示其後的變數是指標型別。而表示式中出現的“*”則是一個運算子用以表示指標變數所指的變數。