第八章——善於利用指針(二)——數組指針

章節結構

  • 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=ap=&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的值(地址)簡單加1
code

自加運算,如++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]

相關文章
相關標籤/搜索