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