如何理解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)取內容運算符*
取內容運算符*是單目運算符,其結合性為自右至左,用來表示指針變量所指的變量。在*運算符之後跟的變量必須是指針變量。需要注意的是指針運算符*和指針變量説明中的指針説明符* 不是一回事。在指針變量説明中,“*”是類型説明符,表示其後的變量是指針類型。而表達式中出現的“*”則是一個運算符用以表示指針變量所指的變量。
-
C語言程序基礎練習題帶答案
C語言傳遞參數均是以值傳遞(passbyvalue),另外也可以傳遞指針(apointerpassedbyvalue)。下面是小編為大家搜索整理的C語言專項訓練題,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!單選題1).下列關於標識符的説法中錯誤的是A.合法的標識符...
-
C語言在屏幕中顯示內容
C語言你瞭解多少呢?你知道C語言在屏幕中顯示內容是什麼樣的嗎?歡迎大家閲讀!更多相關信息請關注相關欄目!我們有兩種方式從計算機獲得信息:一是看屏幕上的文字、圖片、視頻等,二是聽從喇叭發出來的聲音。讓喇叭發出聲音目前還比較麻煩,我們先來看看如何在屏幕上顯示一...
-
C語言基礎循環結構
引導語:循環結構可以減少源程序重複書寫的工作量,用來描述重複執行某段算法的問題,這是程序設計中最能發揮計算機特長的程序結構。以下是本站小編分享給大家的C語言循環結構,歡迎閲讀學習!1.1for循環結構循環語句的一般表達式是:for(表達式1;表達式2;表達式3)語句2....
-
C語言猴子吃桃問題
猴子第一天摘了若干個桃子,當即吃了一半,還不解饞,又多吃了一個;第二天,吃剩下的桃子的一半,還不過癮,又多吃了一個;以後每天都吃前一天剩下的一半多一個,到第10天想再吃時,只剩下一個桃子了。問第一天共摘了多少個桃子?分析:1)設x1為前一天桃子數,設x2為第二天桃子數,則:x...