浅谈 二维数组、指针数组、数组指针、二级指针的区别

来源:互联网 发布:30周b超数据判别男女 编辑:程序博客网 时间:2024/06/05 18:05

声明:6行5列
二维数组:char ary[6][5];///内存大小 6*(5*sizeof(char));
指针数组:char *ary[6];//(char *) ary[5],内存大小 6*sizeof(char *)
数组指针:char (*ary)[5];///内存大小(sizeof(char* [])) 大小为一个指针的大小
二级指针:char **ary;///sizeof(char **)


内存布局:



ary[i][j]取下标,上述4中变量在c中的代码一样:*(*(ary + i) + j)
但其内部寻址方式是不同的
1、二维数组: *(*(ary + i * 5 * sizeof(char)) + j * sizeof(char))
2、指针数组: *(*(ary + i * sizeof(char *)) + j * sizeof(char))
3、数组指针的本质是一个指向数组的指针,然而此处我们让它指向了
ary[0]的位置,由于二维数组(此处不能是动态分配内存)在内存中的
布局是连续的,所以我们可以可以通过数组指针访问二维数组,其实这
早已超出了它本身的范围,如果二维数组是动态分配的,那么下面的
取值方式是不合理的
数组指针: *(*(ary + i * 5 * sizeof(char)) + j * sizeof(char))
4、二级指针: *(*(ary + i * sizeof(char *)) + j * sizeof(char)

 附注:
 上述中的二维数组都是指char ary[][]这样的形式的,动态分配的二维数组是要
 靠指针数组实现

0 0
原创粉丝点击