為了說清楚什麼是指標,必須先弄清楚資料在記憶體中是如何儲存的,又是如何讀取的。
如果在程式中定義了乙個變數,在對程式進行編譯時,系統就會給這個變數分配記憶體單元。編譯系統根據程式中定義的變數型別,分配一定長度的空間。例如,visual c++為整型變數分配4個位元組,對單精度浮點型變數分配4個位元組。記憶體區的每乙個位元組有乙個編號,這就是「位址」,它相當於旅館中的房間號。在位址所標誌的記憶體單元中存放的資料則相當於旅館房間中居住的旅客。由於通過位址可以找到所需的變數單元,可以說,位址指向該變數單元,也將位址形象化地稱為「指標」,意思是通過它能找到以它為位址的記憶體單元。
請務必弄清楚儲存單元的位址和儲存單元的內容這兩個概念的區別,假設程式已定義了3個整型變數i,j,k,在程式編譯時,系統可能分配位址為2000~2003的4個位元組給變數i,2004~2007的4個位元組給j,2008~2011的4個位元組給k,如下圖:
型別名 * 指標變數名;
如:int * pointer_1, * pointer_2;
也可在定義指標變數時,同時對它初始化,int * pointer_1=&a, * pointer_2=&b;
左端的int是在定義指標變數時必須指定的「基型別」。指標變數的基型別用來指定此指標變數可以指向的變數的型別。
注意:(1)指標變數前面的「*」表示該變數的型別為指標型變數 。指標變數名是pointer_1和pointer_2,而不是* pointer_1和* pointer_2。
(2)在定義指標變數時必須指定基型別。因為不同型別的資料在記憶體中所佔的位元組數和存放方式是不同的。後邊還會講到指標的移動和指標的運算(加減),例如「使指標移動乙個位置」或「使指標值加1」,這個1代表什麼呢?如果指標是指向乙個整型變數的,那麼「使指標移動1個位置」意味著移動4個位元組,「使指標加1」意味著使位址值加4個位元組。如果指標是指向乙個字元變數的,則增加的不是4而是1.
(3)如何表示指標型別。指向整型資料的指標型別表示為「int * 」,讀作「指向int的指標」或簡稱「int指標」,可以有int * ,float * ,char * 等指標型別。
(4)& 取位址運算子。&a是變數a的位址。
* 指標運算子,* p代表指標變數p指向的物件。
所謂陣列元素的指標就是陣列元素的位址。
引用陣列元素可以用下標法(如a[3]),也可以使用指標法,即通過指向陣列元素的指標找到所需的元素,使用指標法能使目標程式質量高,(佔記憶體小,執行速度快)。
在c語言中,陣列名代表陣列中首元素(即序號為0的元素)的位址,因此,下面兩個語句等價:
p = &a[0]; //p的值是a[0]的位址
p = a; //p的值是陣列a首元素(即a[0])的位址
注意:陣列名不代表整個陣列,只代表陣列首元素的位址。
在一定條件下允許對指標進行加和減的運算。在指標指向陣列元素時,可以對指標進行以下運算:
分別說明如下:
(1)如果指標變數p已指向陣列中的乙個元素,則p+1指向同乙個陣列中的下乙個元素,p-1指向同乙個陣列中的上乙個元素。執行p+1時並不是將p的值(位址)簡單地加1,而是加上乙個陣列元素所占用的位元組數。例如,陣列元素是float型,每個元素占用4個位元組,則p+1意味著使p的值加4個位元組,以使它指向下乙個元素。
(2)如果p的初值為&a[0],則p+i和a+i就是陣列元素a[i]的位址,或者說它們指向a陣列序號為i的元素。
(3)*(p+i)和*(a+i)是p+i或a+i所指向的陣列元素,即a[i]。例如,*(p+5)或*(a+5)就是a[5],即這三者等價。
(4)如果指標變數p1和p2都指向同一陣列,如執行p2-p1,結果是p2-p1的值(兩個位址之差)除以單個陣列元素的長度。表示p1和p2所指元素的相對距離,兩個位址不能相加,如p1+p2是無實際意義的。
例如:通過指標變數指向陣列元素:
#include int main()
int a[3][4] = ,,};
表示形式
含義位址
a二維陣列名,指向一維陣列a[0],即0行首位址
2000
a[0], * (a+0), * a
0行0列元素位址
2000
a+1,&a[1]
1行首位址
2016
a[1], *(a+1)
1行0列元素a[1][0]的位址
2016
a[1]+2, * (a+1)+2, &a[1][2]
1行2列元素a[1][2]的位址
2024
*(a[1]+2), *(*(a+1)+2), a[1][2]
1行2列元素a[1][2]的值
元素值為13
通過指標引用陣列元素
通過指標應用陣列元素 1 下標法,如a i 形式 2 指標法,如 a i 或 p i 其中a是陣列名,p是指向陣列元素的指標變數,其初值p a 例如 有乙個整數陣列a,有10個元素,要求輸出陣列中的全部元素。1 下標法。includeint main 2 通過陣列名計算陣列元素位址,找出元素的值。i...
C語言 陣列指標和通過指標引用陣列元素的方法總結
1.陣列指標 即指向陣列的指標 那麼,如何宣告乙個陣列指標呢?int p 10 括號是必須寫的,不然就是指標陣列 10是陣列的大小 拓展 有指標型別元素的陣列稱為指標陣列。2.通過指標引用陣列元素的基本方法 1 小標法 a i 2 指標法 a i 或 p i 或 p i 其中,a是陣列名,p a,即...
陣列 指標 引用
一 指標的概念 指標是記憶體中的位址。1 語法 型別 變數名 這裡的型別是定義了這個指標指向的變數型別。2 指標的運算子 和 1 取位址符 例如 int counta 100 int mm mm counta 假設counta所在位址是2000,這是候m 2000。include void main...