iOS 指標詳解
阿新 • • 發佈:2019-12-25
-
指標陣列
與陣列指標
在這裡陣列指標
是指向陣列的指標
,其本質為指標
,指向的物件是陣列
。由於陣列的形式多樣所以陣列指標的表達也十分多樣。同理,指標陣列
就是存放指標的陣列
,其本質為陣列
。由於[ ]
的優先順序高於*
的優先順序,指標陣列
與陣列指標
的表達可做如下表示:
int * p1 [10]; // 指標陣列 p1先與“[ ]”結合構成一個包含10個元素的陣列,int*表示的則是陣列的內容
int (* p2)[10]; // 陣列指標 p2先與“ * ”構成指標定義,int表示陣列內容,[10]表示陣列內元素個數
複製程式碼
-
由於
指向陣列的指標
與指向普通整型變數的指標
不同,在這裡可以再對陣列名
與&陣列名
陣列名
表示指向首元素的首地址
,是一個指向普通變數的指標常量
,當對其+1時偏移量是一個普通資料型別的記憶體大小
。而在陣列名前加上取地址符&後
,表示的就是一個指向陣列的指標常量
,對其+1時偏移量是一個陣列的記憶體大小
-
int p;
//這是一個普通的整型變數
-
int *p;
//首先從P
處開始,先與*
結合,所以說明P
是一個指標
,然後再與int
結合,說明指標所指向的內容的型別為int型
,所以P
是一個返回整型資料的指標
-
int p[3];
//首先從P
處開始,先與[]
結合,說明P
是一個陣列
,然後與int
結合,說明數組裡的元素是整型的
,所以P
是一個由整型資料組成的陣列
-
int *p[3];
//首先從P
處開始,先與[]
結合,因為其優先順序比*
高,所以P
是一個陣列
,然後再與*
結合,說明數組裡的元素是指標型別
,然後再與int
結合,說明指標所指向的內容的型別是整型的
,所以P
是一個由返回整型資料的指標所組成的陣列
-
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