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

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

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[][][]={{{},{},{}},{{},{},{}},{{},{},{}}};

爬上那座山,听最圣洁的经。

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

相关文章:

你感兴趣的文章:

标签云: