指針可以指向復(fù)合類型,上一節(jié)講了指向指針的指針,這一節(jié)學(xué)習(xí)指向數(shù)組的指針。以下定義一個(gè)指向數(shù)組的指針,該數(shù)組有10個(gè)int
元素:
int (*a)[10];
和上一節(jié)指針數(shù)組的定義int *a[10];
相比,僅僅多了一個(gè)()
括號(hào)。如何記住和區(qū)分這兩種定義呢?我們可以認(rèn)為[]
比*
有更高的優(yōu)先級(jí),如果a
先和*
結(jié)合則表示a
是一個(gè)指針,如果a
先和[]
結(jié)合則表示a
是一個(gè)數(shù)組。int *a[10];
這個(gè)定義可以拆成兩句:
typedef int *t;
t a[10];
t
代表int *
類型,a
則是由這種類型的元素組成的數(shù)組。int (*a)[10];
這個(gè)定義也可以拆成兩句:
typedef int t[10];
t *a;
t
代表由10個(gè)int
組成的數(shù)組類型,a
則是指向這種類型的指針。
現(xiàn)在看指向數(shù)組的指針如何使用:
int a[10];
int (*pa)[10] = &a;
a
是一個(gè)數(shù)組,在&a
這個(gè)表達(dá)式中,數(shù)組名做左值,取整個(gè)數(shù)組的首地址賦給指針pa
。注意,&a[0]
表示數(shù)組a
的首元素的首地址,而&a
表示數(shù)組a
的首地址,顯然這兩個(gè)地址的數(shù)值相同,但這兩個(gè)表達(dá)式的類型是兩種不同的指針類型,前者的類型是int *
,而后者的類型是int (*)[10]
。*pa
就表示pa
所指向的數(shù)組a
,所以取數(shù)組的a[0]
元素可以用表達(dá)式(*pa)[0]
。注意到*pa
可以寫成pa[0]
,所以(*pa)[0]
這個(gè)表達(dá)式也可以改寫成pa[0][0]
,pa
就像一個(gè)二維數(shù)組的名字,它表示什么含義呢?下面把pa
和二維數(shù)組放在一起做個(gè)分析。
int a[5][10];
和int (*pa)[10];
之間的關(guān)系同樣類似于int a[10];
和int *pa;
之間的關(guān)系:a
是由一種元素組成的數(shù)組,pa
則是指向這種元素的指針。所以,如果pa
指向a
的首元素:
int a[5][10];
int (*pa)[10] = &a[0];
則pa[0]
和a[0]
取的是同一個(gè)元素,唯一比原來(lái)復(fù)雜的地方在于這個(gè)元素是由10個(gè)int
組成的數(shù)組,而不是基本類型。這樣,我們可以把pa
當(dāng)成二維數(shù)組名來(lái)使用,pa[1][2]
和a[1][2]
取的也是同一個(gè)元素,而且pa
比a
用起來(lái)更靈活,數(shù)組名不支持賦值、自增等運(yùn)算,而指針可以支持,pa++
使pa
跳過(guò)二維數(shù)組的一行(40個(gè)字節(jié)),指向a[1]
的首地址。
1、定義以下變量:
char a[4][3][2] = {{{'a', 'b'}, {'c', 'd'}, {'e', 'f'}},
{{'g', 'h'}, {'i', 'j'}, {'k', 'l'}},
{{'m', 'n'}, {'o', 'p'}, {'q', 'r'}},
{{'s', 't'}, {'u', 'v'}, {'w', 'x'}}};
char (*pa)[2] = &a[1][0];
char (*ppa)[3][2] = &a[1];
要想通過(guò)pa
或ppa
訪問(wèn)數(shù)組a
中的'r'
元素,分別應(yīng)該怎么寫?
聯(lián)系客服