最近笔试经常遇到这个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)
- {
- 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));//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;
- }
原文链接: https://www.cnblogs.com/wencangz/archive/2012/11/10/2764224.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/68862
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!