《C++ Primer》:在C/C++中没有多维数组,只有元素是数组的数组。
- 关于p+1,指针加1移动的距离:一个指针加1移动的距离是它指向的元素在内存中的大小。
- 所以指向int的指针加1走过了4个字节;
- 指向int[n]的指针加1走过了n*4个字节;
- 以此类推。
- *p的类型是p所指向的元素的类型,所以*p+1是p所指向的元素(或元素的类型)加1之后的结果。
- 数组名a是一个指针,这个指针是一个指向其元素类型的指针。
- 对数组名取地址&a是一个指针,这个指针加1走过的距离是&a容纳的元素的个数。
#include <iostream>
using namespace std;
template<typename T>
int f(T p)
{
return int(p+1)-int(p);
}
template<typename T>
int get(T p)//相当于位操作:(10000-1)--> 01111;
{
return *((int*)(p+1)-1);
}
int main()
{
int a[2][2][2][2]={{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}};
int * p;
int (*p1)[2];
int (*p2)[2][2];
int (*p3)[2][2][2];
p = a[0][0][0];
p1 = a[0][0];
p2 = a[0];
p3 = a;
cout<<"p:\t"<<f(p)<<endl;//4: int* p;
cout<<"p1:\t"<<f(p1)<<endl;//8=4*2: int (*p1)[2];
cout<<"p2:\t"<<f(p2)<<endl;//16=8*2: int (*p2)[2][2];
cout<<"p3:\t"<<f(p3)<<endl;//32
cout<<"*p:\t"<<f(*p)<<endl;//1
cout<<"*p1:\t"<<f(*p1)<<endl;//4:1指针4字节(相当于f(p));
cout<<"*p2:\t"<<f(*p2)<<endl;//8=2*4(相当于f(p1));
cout<<"*p3:\t"<<f(*p3)<<endl;//16
cout<<endl;
cout<<"&a:\t"<<get(&a)<<endl;//16=a[1][1][1][1];
cout<<"&a[0]:\t"<<get(&a[0])<<endl;//8=a[0][1][1][1];
cout<<"&a[0][0]:\t"<<get(&a[0][0])<<endl;//4=a[0][0][1][1];
cout<<"*((int*)(&a[0][0][0]+1)-1):\t"<<get(&a[0][0][0])<<endl;//2=a[0][0][0][1];
}