指针数组和数组指针
- 指针数组:数组的每一个元素都是指针,故所占内存的小和机子位数有关。
- 数组指针:数组的指针,即指向一个数组的指针就是数组指针,一般对应的是二维数组。
具体就不细说了,主要是分得清,不要弄混了,直接看下面的例子
例子
#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) << " " << *(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
尾元素后一个元素的地址。