指針變數

存放地址的變數

指針變數是指存放地址的變數。因地址的改變而做出指定性質的衡量變法。

概述


存址量稱指針量。指針量殊量,般量,般量存據,指針量存據址。
舉例:=,系統量配首址,空指針*=,=&存量址指針量,即=&存值(值,&值)。
量訪式:按址找存儲單元,量訪;二按系統=&配址找=&,根據,&值(即量址)找量存存儲單元,量訪。訪式稱訪式,訪式稱訪式。
如果一個指針變數存放的是某個對象的地址,則稱這個指針變數指向該對象。在C++程序設計中,指針變數只有確定了指向才有意義。

定義


1.定義指針變數的一般形式如下:
類型名*指針變數名1,*指針變數名2,...*指針變數名n;
2.空指針
空指針是一個特殊的指針,它的值是0,C語言中用符號常量NULL(在stdio.h中定義)表示這個空值,並保證這個值不會是任何變數的地址。空指針對任何指針類型賦值都是合法的。一個指針變數具有空指針值表示當前它沒有指向任何有意義的東西。
3.void指針
void*)類型的指針叫通用指針,可以指向任何的變數,C語言允許直接把任何變數的地址作為指針賦給通用指針。但是需要注意void*不能指向由const修飾的變數,例如constinttest;void*ptv;ptv=&test;第三句是非法的,只有將ptv聲明為constvoid*ptv,上述第三句ptv=&test才是合法的。
當需要使用通用指針所指的數據參加運算時,需要寫出類型強制轉換。如通用指針ptv所指空間的數據是整型數據,p是整型指針,用此式轉換:p=(int*)ptv;

區別


指針是C語言的精華部分,通過利用指針,我們能很好地利用內存資源,使其發揮最大的效率。有了指針技術,我們可以描述複雜的數據結構,對字元串的處理可以更靈活,對數組的處理更方便,使程序的書寫簡潔,高效,清爽。但由於指針對初學者來說,難於理解和掌握,需要一定的計算機硬體的知識做基礎,這就需要多做多練,多上機動手,才能在實踐中儘快掌握,成為C的高手。
過去,我們在編程中定義或說明變數,編譯系統就為已定義的變數分配相應的內存單元,也就是說,每個變數在內存會有固定的位置,有具體的地址。由於變數的數據類型不同,它所佔的內存單元數也不相同。若我們在程序中做定義為:
inta=1,b=2;
floatx=3.4,y=4.5;
doublem=3.124;
charch1='a',ch2='b';
讓我們先看一下編譯系統是怎樣為變數分配內存的。變數a,b是整型變數,在內存各佔2個位元組;x,y是實型,各佔4個位元組;m是雙精度實型,佔8個位元組;ch1,ch2是字元型,各佔1個位元組。由於計算機內存是按位元組編址的,設變數的存放從內存2000單元開始存放,則編譯系統對變數在內存的安放情況如右圖所示。
指針變數
指針變數
變數在內存中按照數據類型的不同,占內存的大小也不同,都有具體的內存單元地址,如變數a在內存的地址是2000,佔據兩個位元組后,
變數b的內存地址就為2002,變數m的內存地址為2012等。對內存中變數的訪問,過去用scanf("%d%d%f",&a,&b,&x)表示將數據輸入變數的地址所指示的內存單元。那麼,訪問變數,首先應找到其在內存的地址,或者說,一個地址唯一指向一個內存變數,我們稱這個地址為變數的指針。如果將變數的地址保存在內存的特定區域,用變數來存放這些地址,這樣的變數就是指針變數,通過指針對所指向變數的訪問,也就是一種對變數的“間接訪問”。
設一組指針變數pa、pb、px、py、pm、pch1、pch2,分別指向上述的變數a、b、x、y、m、ch1、ch2,指針變數也同樣被存放在內存,儘管所指向的變數類型不同,但是這些指針變數所佔內存空間都是2個位元組,而與所指向變數的類型無關。二者的關係如右圖所示:
在上圖中,左部所示的內存存放了指針變數的值,該值給出的是所指變數的地址,通過該地址,就可以對右部描述的變數進行訪問。如指針變數pa的值為2000,是變數a在內存的地址。因此,pa就指向變數a。變數的地址就是指針,存放指針的變數就是指針變數。