章節結構
- 8.3 經過指針引用數組
- 8.3.1 數組元素的指針
- 8.3.2 在引用數組元素時指針的運算
- 8.3.3 經過指針引用數組元素
- 8.3.4 用數組名做函數參數(以及用數組名與變量名做爲函數參數的比較)
- 8.3.5 經過指針引用多維數組
- 8.3.6 多維數組元素的地址
- 8.3.7 指向多維數組元素的指針變量
- 8.3.8 用指向數組的指針做函數參數
8.3.1 數組元素的指針
- 所謂數組元素的指針就是數組元素的地址
- 引用數組元素能夠使用下標法,也能夠用指針法
- 數組名就是數組的地址。數組首元素的地址也就是數組的地址
假設p爲指向數組的指針,a爲數組名則有:p=a
且p=&a[0]
程序中的數組名不表明整個數組,只表明數組首元素的地址,所以數組
int a[4] = { 1,3,4,5}; int * p; p = &a[0]; // p的值是a[0]的地址 p = a; // p的值是數組a首元素(即a[0]) 的地址
p = &a[0]
和p = a
等價函數
定義指針變量時能夠同時對其初始化 int * p = &a[0]; 等效於 int * p; p = &a[0]; 或 int * p; p = a; // a爲數組名
8.3.2 在引用數組元素時指針的運算(4點說明)
說明:下面p表示指針名,a表示數組名指針
- (1)在指針已指向一個數組元素時,就能夠對指針進行如下運算
加一個整數(用+或+=),如p+1;(指向同一數組中的下一個元素)
減一個整數(用-或-=),如p-1;(指向同一數組中的上一個數組)
這裏,給指針直接加1,
表示的是加上一個數組元素所佔用的字節數,而不是將p的值(地址)簡單加1code
自加運算,如++p,p++;
自減運算,如--p,p--;對象
- (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]
等價編譯
實際上,在編譯時,對數組元素a[i]就是按*(a+i)處理的,即按數組首元素的地址加上相對位移量獲得要找的元素的地址,而後找出該單元中的內容。class
[]實際上變址運算符,即將a[i]按a+i計算地址,而後找出此地址單元中的值變量
- (4)若是指針變量p1和p2都指向同一數組中的元素,如執行
p1-p2
,結果是p2-p1
的值(兩個地址之差)除以數組元素的長度。
- 兩個指針相減,如p1 -p2(只有p1和p2都指向同一數組中的元素時纔有意義,表示p1和p2之間相差多少元素)
- 兩個地址不能相加,如
p1+p2
是無實際意義的。
8.3.3 經過指針引用數組元素
引用一個數組元素,能夠有兩種方法引用
- 下標法,如a[i]形式;
- 指針法,如
*(a+i)
或*(p+i)
,其中a是數組名,p是指向數組元素的指針變量
所以引用一個數組中各元素的值有三種方法程序
- 下標法,
a[3]
- 經過數組名計算數組元素地址,找出元素的值,
*(a+i)
- 用指針變量指向數組元素
*(p+i)
數組名是一個指針型常量,它的值在程序運行期間是固定不變的,所以沒法實現
a++
*(p--)
*(++p)
8.3.4 用數組名做函數參數
若是用指針變量作實參,必須先使指針變量有肯定值,指向一個已定義的對象。
數組名做函數參數。 實參數組名錶明該數組首元素的地址,而形參是用來接收從實參傳遞過來的數組首元素地址的。 所以,形參應該是一個指針變量(只有指針變量才能存放地址)。實際上,C編譯都是將形參數組名做爲指針變量來處理的。
即void fun(int arr[],int n)
等價於void fun( int * arr,int n)
實參數組名錶明一個固定的地址,或者說是指針常量,但形參數組名並非一個固定的地址,而是按指針變量處理。
8.3.5 經過指針引用多維數組
(1)多維數組元素的地址 二維數組名是指向行(一維數組)的。
int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};
(2) 指向多維數組元素的指針變量
- 指向數組元素的指針變量
int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}}; int * p; p = a[0];
- 指向由m個元素組成的一維數組的指針變量
int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}}; int (*p)[4];// 指向一維數組的指針 p = a; // p指向二維數組的0行
(3)用指向數組的指針做函數參數 一維數組名能夠做爲函數參數,多維數組名也可做函數參數。
用指針變量做形參,以接受實參數組名傳遞來的地址。
能夠有兩種方法:(a)用指向變量的指針變量 * score
(b)用指向一維數組的指針變量 ·(* score)[4]