每日一题(25)——多维数组的指针操作
2013-01-18 17:40
477 查看
《C++ Primer》:在C/C++中没有多维数组,只有元素是数组的数组。
关于p+1,指针加1移动的距离:一个指针加1移动的距离是它指向的元素在内存中的大小。
所以指向int的指针加1走过了4个字节;
指向int
的指针加1走过了n*4个字节;
以此类推。
*p的类型是p所指向的元素的类型,所以*p+1是p所指向的元素(或元素的类型)加1之后的结果。
数组名a是一个指针,这个指针是一个指向其元素类型的指针。
对数组名取地址&a是一个指针,这个指针加1走过的距离是&a容纳的元素的个数。
关于p+1,指针加1移动的距离:一个指针加1移动的距离是它指向的元素在内存中的大小。
所以指向int的指针加1走过了4个字节;
指向int
的指针加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]; }
相关文章推荐
- 多维数组a[x][y]的指针操作及ptr+1 a+1和&a+1区别
- 用指针操作多维数组
- C++学习计划之指针和多维数组的操作
- 多维数组和指针操作
- 数组指针的指针操作
- 图解c/c++多级指针与“多维”数组
- [C/C++]多重指针和多维数组
- C语言多维数组与多级指针
- 数组的递进理解——由一维到多维,数组和指针的关系比较等
- 多维数组和多维指针(数组参数和指针参数)
- 多级指针、多维数组
- 多维数组 用typedef简化指针
- 数组与指针--多维数组与多重指针使用注意事项
- 关于字符数组的指针移动操作
- 指针、数组中的注意点(多重指针,指针数组,多维数组)
- C语言中的多维数组与指针
- 数据结构与算法:动态数组(利用万能指针实现任意类型数组操作)
- 多维数组的指针类型转换和参数传递
- 关于C 多维数组与指针的问题
- PHP数组的初始化 访问数组 数组操作符 多维数组的排序 对数组重新排序 从文件载入数组的方法 数组其他有用的操作 统计数组个数 将数组转换称标量变量 extract()