指針在提供方便的同時(shí),也相當(dāng)危險(xiǎn).
int main(int argc, const char * argv[]) {
int array[4] = {9,10,11,12};
int array2[8] = {1,2,3,4,5,6,7,8};
for (int i = 0; i < 12; ++i) {
printf("%d\n", array2[i]);
}
return 0;
}
運(yùn)行的結(jié)果如下:
1
2
3
4
5
6
7
8
9
10
11
12
array朴摊、array2的內(nèi)存結(jié)構(gòu)默垄,在它們初始化的時(shí),都是放在棧中甚纲,而棧的物理結(jié)構(gòu)是連續(xù)的口锭,并且按照FIFO的原則,array先初始化放在高地址,array2后初始化放在低地址鹃操。如下圖所示:
可見(jiàn)韭寸,透明的指針帶來(lái)的問(wèn)題在于,開(kāi)發(fā)者知道了太多他們本來(lái)不該知道的東西(比如開(kāi)發(fā)者竟然可以拿到變量的真實(shí)地址荆隘,還可以不借助變量名就訪問(wèn)一個(gè)變量恩伺,比如這里的 array)。在某些精心構(gòu)造的場(chǎng)合下椰拒,攻擊者甚至可以通過(guò)修改字符串的值來(lái)控制程序的執(zhí)行邏輯晶渠,只要計(jì)算得當(dāng),他們可以調(diào)用原本根本不會(huì)被調(diào)用的函數(shù)燃观。
在引用的概念中褒脯,引用就是引用,它什么也不是缆毁,更不可能是數(shù)字番川,也就談不上什么四則運(yùn)算了。因此想要通過(guò) A 對(duì)象的引用來(lái)訪問(wèn) B 對(duì)象是完全不可能的脊框。