举例理解C语言二维数组的指针指向问题
之前对数组的概念一直没有理解透彻,只觉得数组名就是个常量指针而已,用法和基本的指针差不多。所以当我尝试用二级指针去访问二维数组时,就经常会出错。下面就是刚开始写的一个错误的程序: #include <stdio.h> int main() { int iArray[2][3] = {{1,2,3},{4,5,6}}; int **pArray = NULL; pArray = iArray; printf("array[0][0] = %dn",pArray[0][0]); printf("array[1][2] = %dn",pArray[1][2]); return 0; } 开始的时候我是这样分析的:本来数组和指针就差不多,一维数组和一维指针对应,那么二维数组名应该和二维指针差不多,所以上面那个程序是没有错的,应该打印出的是1和6。但是当我实际编译运行的时候,却出现了段错误,也就是我访问了不该访问的地址空间。那错误到底出在什么地方呢?正确的程序应该怎么写呢? int main() { int iArray[2][3] = {{1,6}}; int *pArray = NULL; pArray = iArray; printf("array[0][0] = %dn",*pArray); printf("array[1][2] = %dn",*(pArray + 1 * 3 + 2)); return 0; } 因为数组本身在地址空间中就是连续排列的,根据行数和列数,我们自己计算出访问单元的地址偏移量就可以用一级指针轻松遍历二维数组中的所有数据了。 int main() { int iArray[2][3] = {{1,6}}; int (*pArray)[3] = NULL; pArray = iArray; printf("array[0][0] = %dn",pArray[1][2]); return 0; } 简单分析一下这个程序:我们知道[]运算符的结合方向是由左向右,pArray[1][2]就等价于(* (pArray + 1))[2],而由于pArray是数组指针,而且数组的长度为3,所以* (pArray + 1)就表示iArray[1]这个数组,则pArray[1][2]则就完全等价于iArray[1][2]。 int main() { int iArray[2][3] = {{1,6}}; int *ipArray[2] = {iArray[0],iArray[1]}; int **pArray = NULL; pArray = ipArray; printf("array[0][0] = %dn",pArray[1][2]); return 0; } 由于二级指针要跳两次,所以中间还需要额外的存储一级指针的空间。所以一般不建议用二级指针去访问二维数组。 众所周知,指针实质就是地址!一个变量的地址即称为此变量的“指针”。如果有这样一种变量:它的存储单元里存放的是其它变量的地址!我们就称之为“指针变量”。(请注意两者之间的区别:两个完全不同的概念!) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |