今天看到一段代碼就很疑惑捆昏。請(qǐng)看:
int (*p)[5] = (int (*)[5])malloc(sizeof(int) * 5);
for(int i = 0; i < 5; i++)
{
*(*p + i) = i;
}
for(int i = 0; i < 5; i++)
{
printf("%d\t", (*p)[i]);
}
我看到這段代碼很奇怪子刮,因?yàn)槲矣X(jué)得這里應(yīng)該是使用p的,p本來(lái)就是malloc內(nèi)存的首地址悯蝉,為什么還要加上一個(gè)尋址符號(hào)呢归形?
這讓我對(duì)我一開(kāi)始建立起來(lái)的指針模型產(chǎn)生了懷疑。于是我又在程序里面將這個(gè)p的值以及*p的值以16進(jìn)制的形式打印了出來(lái)鼻由。
20190329225906.png
我發(fā)現(xiàn)他們的值實(shí)際上是一樣的暇榴。
然后我又再gdb里面查看了他們的數(shù)據(jù)類(lèi)型。然而我發(fā)現(xiàn)雖然他們是同樣的一個(gè)值蕉世。但是p和*p的數(shù)據(jù)類(lèi)型是不同的蔼紧,請(qǐng)看:
20190329230419.png
所以這應(yīng)該是數(shù)組指針的鍋,所以得出的結(jié)論就是如果要通過(guò)數(shù)組指針訪問(wèn)數(shù)組元素的話狠轻,應(yīng)該要使用取值符號(hào)將數(shù)組指針轉(zhuǎn)換成為數(shù)組奸例??向楼?
同時(shí)的話查吊,還有一點(diǎn)要注意的就是實(shí)際上聲明(定義)的數(shù)組,他們的變量(指針)是一個(gè)常量湖蜕,是不能被改變的 逻卖。
其實(shí)也直接可以通過(guò)數(shù)組的首地址指針來(lái)訪問(wèn)數(shù)組。
好吧昭抒,其實(shí)我還是希望能夠得到一個(gè)合格合理的解釋评也。
求教。