1. 程式人生 > >C++陣列名a和&a的區別

C++陣列名a和&a的區別

先看一道測試題:

int main()
{
	int a[5] = {1, 3, 0, 4, 6};
	int *p = (int*)(&a + 1);
	cout<<*(a + 1)<<' ';
	cout<<*(p - 1)<<endl;
	return 0;
}

猜猜結果?

下面說說a和&a的區別,說完了,再看該題的結果。

C/C++裡面的陣列名字會退化為指標,所以陣列名a實際指的是陣列的第一個元素的地址。而陣列名作為指標來講有特殊性,它正在它所指向的記憶體區域中,&a的值和a的數值是相同的(可以輸出觀察一下),但是型別和意義不同。而指標的加法操作和指向的資料型別密切相關。

所以,int a[10]; a就相當於int *,如果是對它加1(a + 1)是相當於a + 1 * sizeof(int)。但是&a的型別則相當於int **,是所謂指向陣列的指標,是陣列元素型別的二級指標,對它加1是相當於 &a + 1 * sizeof(a)的,所以會偏移一個數組長度。

現在來看程式,&a + 1其實偏移了一個數組的長度即就是6,其實在VS中通過除錯可以檢視&a + 1的型別,其型別為int[5] *,所以(int*)(&a + 1)將其強制轉成int *型別。這裡應該很明顯了a + 1指向的是陣列a的第二個元素,p指向的是陣列後面的元素(這裡我們不知道它是多少),p - 1則指向陣列的最後一個元素! 

所以程式執行的結果為3 6.