數組指針和指針數組及引用的簡單理解.md

a和&a的區別,及指針數組和數組指針的簡單理解:

以代碼的形式解釋:

#include <iostream>
using namespace std;

int main()
{
	//a是數組時,a 和 &a的區別
	int a[5] = { 1,2,3,4,5 };
	int *ptr1 = (int *)(&a+1);
	ptr1--;
	cout << *(a + 1)<<" ";
	cout << *(ptr1) << endl;
	//輸出:2 5
	/*
		結果 5 解釋如下:
		a是指向數組a的首地址,而&a指向了整個數組a
		所以 &a+1 指向了整個數組後面哪一位(也就是a[4]後面的位置)
		
		由此可以&a可以寫成下面形式: int(*p)[5] = &a;
	*/

	int(*p)[5] = &a;
	int *tptr = (int *)(&a+1 );
	cout << p + 1 << " " << tptr << endl;
	//輸出:0095FAE4 0095FAE4
	//由此的確證明了 int(*p) [5] = &a

	/*
		那int(*p)[3]與int* p[3]的區別是什麼呢(即指針數組和數組指針的區別):
		int(*p)[3] 定義了一個指針變量p,這個指針變量指向了一個含有三個int類型的數組,
		這個指針稱爲 數組指針,也叫行指針
		int* p[3] 定義了一個數組p,這個數組裏面有三個int類型的指針變量(p[0]、p[1]、p[2])
		這樣的數組稱爲 指針數組
		
		int(*p)[3]中 p+1將指向下一行的數組,如果沒有下一行,就會執行這一行最後一個元素的後面
		因此可以用p[0]來表示這一行,p[0][i]獲取這一行中的數,
		由於只有一行,所以用p[1][i]就會輸出不對,下面實踐證明:
	*/
	cout << p[0][1] <<" "<<p[0][2]<<" 不存在第二行的情況:"<<p[1][0]<< endl;
	//輸出結果: 2 3 不存在第二行的情況:-858993460
	

	//int b[3][3] = { 1,2,3,4,5,6,7,8,9 };
	//int (*ptr2)[3];
	//ptr2 = &b[1];
	//ptr2++;
	//cout << ptr2 [0][1]<<"\t"<< ptr2[1][1] << endl;

	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章