现在的位置: 首页 > 综合 > 正文

二维(及高维)数组指针意义和使用

2013年12月01日 ⁄ 综合 ⁄ 共 980字 ⁄ 字号 评论关闭

以前以为数组很简单,现在发现原来是自己很肤浅,昨天写了一段代码总是越界一晚上也没搞清楚是怎么回事,现在才发现是在对二维数组的指针引用上出错了,下面是目前发现几种形式:

1. 首先静态二维数组如何作为参数传入函数形式:

void myfunc(char sToken[][100])

void myfunc(char (*sToken)[100])
是等价的!

2.静态二维数组元素a[i][j]可表示成*(a[i]+j)或*(*(a+i)+j), 它们都与a[i][j]等价, 或者还可写成(*(a+i))[j]。

此时注意(*a+i)[j]和(*(a+i)[j])与前面表示的不同之处(数组其实就是指针,上次在csdn上写的那个).

3.下面是一段测试代码

void main(){
 double Array[3][3] = {{3,-0.1,-0.2},{0.1,7,-0.3},{0.3,-0.2,10}};
 //Decompose(Array, 3);
 
 double (*ptr)[3] = Array;
 //ptr是(*)[]类型的指针,它存储的是数组第一维(即每一行)的首地址,它的每一次递增增加的地址数都是3个double类型的字节数
 ptr = &Array[1];
 //ptr中的内容其实是一个[]类型的指针,即数组第二维(即特定某一行)的首地址,它的每一次递增增加的是1个double类型的字节数
 //同时注意[]的优先级高于*(解引用dereference)的优先级
 cout << (*(ptr+1)[1]) << endl;
 cout << (*(ptr+1))[1] << endl;
 cout << *(*(ptr + 1)+1) << endl;
 cout << (*ptr + 1)[1] << endl;
}

输出结果分别为,越界值、-0.2、-0.2-0.3。可以根据上面和注释中所解释的推测出来。

4.高维数组的定义应该是从最后一维进行递归定义的,或者从第一维开始一步步嵌套定义。

高维数组的指针其实就是多层指针,从最外面一层(*)[][]--->(*)[]--->[],每一层的指针类型是不相同的,每一层的指针递增的时候+1之后增加的字节数是不相同的。

比如:三维数组的指针定义为 int (*p)[m][n],三维数组定义为int A[][][]={{{},{},{}},{{},{},{}},{{},{},{}}};

抱歉!评论已关闭.