最近笔试经常遇到这个p+1的问题,,还是《C++ Primer》说的明白:在C/C++中没有多维数组,只有元素是数组的数组。
- 关于指针加1移动的距离:一个指针加一移动的距离是它指向的元素在内存中的大小。
- 所以指向int的指针加1走过了4个字节;
- 指向int[n]的指针加1走过了n*4个字节;
- 以此类推。
- *p的类型是p所指向的元素的类型,所以*p+1是p所指向的素的类型加以之后的结果。
- 数组名a是一个指针,这个指针是一个指向其元素类型的指针。
- 对数组名取地址&a是一个指针,这个指针加1走过的距离是元素的个数乘以给个元素的大小。
template<typename T>
int f(T p)
{
return int(p+1)-int(p);
}
template<typename T>
int get(T p)
{
return *((int*)(p+1)-1);
}
int main( void )
{
int a[2][2][2]={{{1,2},{3,4}},{{5,6},{7,8}}};
int* p;
int (*p1)[2];
int (*p2)[2][2];
p=a[0][0];
p1=a[0];
p2=a;
print(f(p));//4
print(f(p1));//4*2=8
print(f(p2));//4*2*2=16
print(f(*p));//1
print(f(*p1));//4
print(f(*p2));//4*2=8
print(get(&a));//8=a[1][1][1]
print(get(&a[0]));//4=a[0][1][1]
print(get(&a[0][0]));//2=a[0][0][1]
return 0;
}