指針數組和數組指針
- 指針數組:數組的每一個元素都是指針,故所占內存的小和機子位數有關。
- 數組指針:數組的指針,即指向一個數組的指針就是數組指針,一般對應的是二維數組。
具體就不細說了,主要是分得清,不要弄混了,直接看下面的例子
例子
#include<iostream>
using namespace std;
int main()
{
//定義數組
int arr1[3];
int arr2[3][10];
//數組指針
int *p1 = arr1;
int(*p2)[10] = arr2;
//首地址
cout << arr1 << " " << p1 << " " << &arr1[0] << " " << &p1[0] << endl;
//第二行的首地址
cout << arr1 + 1 << " " << p1 + 1 << " " << &arr1[1] << " " << &p1[1] << endl;
//首地址
cout << arr2 << " " << p2 << " " << p2[0] << " " << &p2[0][0] << endl;
//第二行的首地址
cout << arr2 + 1 << " " << p2 + 1 << " " << p2[1] << " " << &p2[1][0] << endl;
//arr2[1][1]的地址
cout << arr2[1] + 1 << " " << p2[1] + 1 << " " << &p2[1][1] << " " << &(*(*(p2 + 1) + 1)) << endl;
//指針數組,下面三種寫法效果一樣
int *(n1[10]); //指針大小32位機為4,64位機為8
int *(n2)[10];
int *n3[10];
cout << sizeof(n1) << " " << n1 << " " << n1 + 1 << " " << &n1[2] << endl;
cout << sizeof(n2) << " " << n2 << " " << n2 + 1 << " " << &n2[2] << endl;
cout << sizeof(n3) << " " << n3 << " " << n3 + 1 << " " << &n3[2] << endl;
system("pause");
return 0;
}
運行結果:
區別和相關用法如上,可對比查看。
再舉個例子
#include <iostream>
using namespace std;
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int*)(&a + 1);
cout << *(ptr - 1) << "\t" << *(ptr - 2) << endl; // 5 4
cout << &a + 1 << " " << *(&a + 1) << " " << &a[5] << endl;
cout << "----------------" << endl;
int *p = (int *)(a + 1); //2
cout << *p << endl;
return 0;
}
運行結果:
這里的數組指針指向的是一維數組,主要是&a
和a
要分清:
1.a
是數組名,是數組首元素地址,+1
表示地址值加上一個int
類型的大小,如果a
的值是0x00000001
,加1操作后變為0x00000005
。*(a + 1) = a[1]
。
2.&a
是數組的指針,其類型為int(*)[5]
(就是前面提到的數組指針),其加1時,系統會認為是數組首地址加上整個數組的偏移(5個int
型變量),值為數組a
尾元素后一個元素的地址。