指針數組
與數組指針
在這裏數組指針
是指向數組的指針
,其本質爲指針
,指向的對象是數組
。因爲數組的形式多樣因此數組指針的表達也十分多樣。同理,指針數組
就是存放指針的數組
,其本質爲數組
。因爲[ ]
的優先級高於*
的優先級,指針數組
與數組指針
的表達可作以下表示:int * p1 [10]; // 指針數組 p1先與「[ ]」結合構成一個包含10個元素的數組,int*表示的則是數組的內容
int (* p2)[10]; // 數組指針 p2先與「 * 」構成指針定義,int表示數組內容,[10]表示數組內元素個數
複製代碼
因爲指向數組的指針
與指向普通整型變量的指針
不一樣,在這裏能夠再對數組名
與&數組名
的關係進行理解 在一維數組中,數組名
表示指向首元素的首地址
,是一個指向普通變量的指針常量
,當對其+1時偏移量是一個普通數據類型的內存大小
。而在數組名前加上取地址符&後
,表示的就是一個指向數組的指針常量
,對其+1時偏移量是一個數組的內存大小
git
int p;
//這是一個普通的整型變量
github
int *p;
//首先從P
處開始,先與*
結合,因此說明P
是一個指針
,而後再與int
結合,說明指針所指向的內容的類型爲int型
,因此P
是一個返回整型數據的指針
數組
int p[3];
//首先從P
處開始,先與[]
結合,說明P
是一個數組
,而後與int
結合,說明數組裏的元素是整型的
,因此P
是一個由整型數據組成的數組
bash
int *p[3];
//首先從P
處開始,先與[]
結合,由於其優先級比*
高,因此P
是一個數組
,而後再與*
結合,說明數組裏的元素是指針類型
,而後再與int
結合,說明指針所指向的內容的類型是整型的
,因此P
是一個由返回整型數據的指針所組成的數組
spa
int (*p)[3];
//首先從P
處開始,先與*
結合,說明P
是一個指針
,而後再與[]
結合,說明指針所指向的內容是一個數組
,而後再與int
結合,說明數組裏的元素是整型的
,因此P
是一個指向由整型數據組成的數組的指針
指針
int arrayName[4] = {10, 20, 30, 40};
int *p = (int *)(&arrayName + 1);
NSLog(@"%d", *(p - 1));
複製代碼
(&arrayName + 1)
:&arrayName
是數組的地址(等價於指向arrayName數組的指針
)- 增長
1
會日後移動16個字節
,開始是4個字節的位置
,移動後就是16個字節後面的位置
(也就是目前位置是20個字節
)- 最後又賦值給
int類型
的指針p
(int類型佔4個字節
)- 因此
(p - 1)
就是減去4個字節
,變成爲16個字節的位置
,輸出的*(p - 1)
值爲40
附:個人博客地址code