Chinaunix首页 | 论坛 | 博客
  • 博客访问: 147408
  • 博文数量: 52
  • 博客积分: 85
  • 博客等级: 民兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-28 09:25
文章分类
文章存档

2013年(4)

2012年(48)

分类:

2012-03-06 15:15:37

原文地址:二维数组和二级指针 作者:

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;
阅读(962) | 评论(0) | 转发(0) |
0

上一篇:sizeof

下一篇:双向链表

给主人留下些什么吧!~~