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;
}