指針經(jīng)典題
思考:以下小程序厨喂,輸出結(jié)果是多少泉手?
int numbers[4] = {10, 20, 30, 40, 50};
int *p = (int *)(&numbers + 1);
NSLog(@"%d", *(p - 1));
思路分析
首先分析一維數(shù)組
int numbers[4] = {10, 20, 30, 40};
NSLog(@"%p %p", numbers, numbers + 1);
NSLog(@"%p %p", &numbers, &numbers + 1);
- numbers : 存儲(chǔ)的是
數(shù)組首元素
的地址,相當(dāng)于&numbers[0]
汇恤,等價(jià)于指向numbers[0]的指針
,所以numbers + 1的跨度是整型數(shù)據(jù)10所占用的字節(jié)數(shù)索守;
- &numbers : 等價(jià)于指向numbers數(shù)組的指針胜茧,所以&numbers + 1的跨度是整個(gè)數(shù)組numbers所占用的字節(jié)數(shù)媳瞪;
其次分析二維數(shù)組
int numbers[2][2] = {
{10, 20}, // numbers[0]
{11, 22} // numbers[1]
};
- numbers[0] == &numbers[0][0],相當(dāng)于一個(gè)指向numbers[0][0]的指針骗炉;
- numbers == &numbers[0],相當(dāng)于一個(gè)指向numbers[0]的指針
- &numbers == 相當(dāng)于一個(gè)指向numbers的指針
最后分析三維數(shù)組
int numbers[2][2][2] = {
{
{10, 11},
{12, 13}
},
{
{14, 15},
{16, 17}
}
};
- numbers[0][0] == &numbers[0][0][0],相當(dāng)于是一個(gè)指向numbers[0][0][0]的指針
- numbers[1] == &numbers[1][0],相當(dāng)于是一個(gè)指向numbers[1][0]的指針
- numbers == &numbers[0],相當(dāng)于是一個(gè)指向numbers[0]的指針
- &numbers == 相當(dāng)于是一個(gè)指向numbers的指針
解答
int numbers[4] = {10, 20, 30, 40, 50};
int *p = (int *)(&numbers + 1);
NSLog(@"%d", *(p - 1));
- &numbers == 相當(dāng)于是一個(gè)指向numbers的指針的指針蛇受,&numbers + 1的跨度為整個(gè)數(shù)組numbers的字節(jié)句葵,(&numbers + 1)指向了數(shù)組的末尾
-
(int *)(&numbers + 1)
將指向整個(gè)數(shù)組的指針強(qiáng)轉(zhuǎn)為指針整型的指針,它的跨度為int類型的字節(jié)
-
(p - 1)
是指向了數(shù)據(jù)最后一個(gè)數(shù)據(jù)的指針,*p
取得得數(shù)據(jù)是50乍丈;
結(jié)論
指針p的加減法運(yùn)算
- 指針p + N
- p里面存儲(chǔ)的地址值 + N * 指針?biāo)赶蝾愋偷恼加米止?jié)數(shù)
- 指針p - N
- p里面存儲(chǔ)的地址值 - N * 指針?biāo)赶蝾愋偷恼加米止?jié)數(shù)
數(shù)組名
- 存儲(chǔ)的是
數(shù)組首元素
的地址
- 等價(jià)于:一個(gè)指向
數(shù)組首元素
的指針
-
數(shù)組名 + 1
的跨度:數(shù)組首元素
的占用字節(jié)數(shù)
其他結(jié)論
-
&num + 1
的跨度:num
的占用字節(jié)數(shù)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者