您的位置:首页 > 其它

每日一题(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容纳的元素的个数。
 

#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];
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: