文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C++ 二维数组与指针的关系

C++ 二维数组与指针的关系

时间:2010-09-01  来源:kanong

  很多人都以为二维数组名是一个二维指针,如下

  char a[2][2];

  char **p =a;   //这行语句不能通过编译

  其实上述的做法错误的关键在于数组名的类型不是二维指针,在具体的介绍二维数组名的本质之前,我们先看看下面的代码:

   char a[2][2]={{'1','2'},{'3','4'}};

   cout<<(unsigned int)(a)<<endl;       //输出为1244996    

   cout<<(unsigned int)(a+1)<<endl;    //输出为1244998    加了2个字节

  cout<<(unsigned int)(*a+1)<<endl;  //输出为1244997    加了1个字节 

  cout<<(unsigned int)(&a+1)<<endl;  //输出为1245000    加了4个字节

 

  出现上述结果的原因在于,指针在进行加减法的时候与指针的类型有很大的关系,如果p是(int *)类型的话 , p+1会在p的地址的基础上加4 , 而如果是(char  *)的话,p+1会在p的地址的基础上加1。

  这样就可以解释上面的结果了:

  a的类型是char (*)[2];     也就是指向数组大小为2的数组指针 , 所有a+1当然是在a的基础上加2了

  *a的类型是char *;      也就是字符指针           所有*a+1当然是在a的基础上加1了

  &a的类型是char (*)[2][2]   也就是指向二维数组的指针了      所有&a+1当然是在a的基础上加4了

 

  至于C++为什么要这样处理 , 我建议看看谭浩强C语言书里面关于数组与指针关系的那部分,他用排队来描述这样做的原因,我觉的很形象。

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载