Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5223730
  • 博文数量: 553
  • 博客积分: 13864
  • 博客等级: 上将
  • 技术积分: 11041
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-28 21:25
个人简介

个人Blog: hhktony.com

文章分类

全部博文(553)

文章存档

2015年(1)

2014年(2)

2013年(12)

2012年(384)

2011年(154)

分类: LINUX

2012-03-01 13:20:03

Fun (int **p){}这里面的int **p //这里的p不是二维数组的指针,而是指向指针的指针,即二级指针。

正确的二维数组的指针应该是:int a[2][2];int (*p)[2];//定义时无论数组维数,只可忽略第一维

例如:int a[2][2] = {{0,1},{2,3}};

int **p = (int**)a;//强制将二维数组指针转为指向指针的指针

则此时p[0] = 0; p[1] = 1; p[2] = 2; p[3] = 3;

而p[0][0] = *(*(p+0)+0) = **p;

p[0][1] = *(*(p+0)+1);

对于p[0][0]:由于*p = 0; ====> **p = *(0);引用地址为零的内存,必然是错误的。

对于p[0][1] = *(*p+1)====>*(4),引用了非法内存同样,

对于p[1][0] = *(1),p[1][1] = *(5),均引用了非法内存所以说,二位数组并不能简单的转换成指向指针的指针。

二维数组其实只是一个指针,而二级指针是指向指针的指针,所以二者并不等价。如上例所示:int a[2][2];

a是指向整个数组的首地址,并不是int **;所以不要指望向函数fun里面传实参 p=a;
阅读(4844) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~