标签:
在打印二维数组时遇到了问题,二维数组可以这样定义int matrix[ROWS][COLUMNS],但是打印二维数组时函数的声明是void printMatrix(int ** numbers,int rows,int columns)。那么将matrix作为参数传递给printMatrix时会出现问题,因为matrix是 int (*)[COLUMNS]类型的,但是函数printMatrix需要的是int **类型的,这两者明显不匹配。
int **从类型上讲是一个指向整型指针的指针,那么如果想要用它来表示一个矩阵需要怎么做呢?因为它的元素是一个指针,如果如果它的每一个元素都表示矩阵的一行,那么它就可以用来表示一个矩阵了。实现代码如下:
//生成矩阵 int ** generateMatrix(int rows,int columns) { int **numbers=new int*[rows]; for(int i=0;i<rows;i++){ numbers[i]=new int[columns]; for(int j=0;j<columns;j++) numbers[i][j]=i*columns+j; } return numbers; }
这里numbers是一个指向指针的指针,能够用numbers用来表示矩阵的关键就在于使用new关键字分配的内存是连续的,这样number[i]的地址就可以根据numbers的地址计算出来,因为指针变量占据4个字节的内存区域(32位机器)。
如果不使用上面的方式分配内存,numbers就真的只是一个指向指针的指针了
下面列出几种numbers初始化错误的处理方式及错误的原因:
错误1:
int p[]={1,2,3,4}; int **numbers=&p;这种用法会报如下错误:error:cannot convert "int (*)[4]" to "int **" in initialization int **numbers=&p;
原因是类型不匹配,p是一个指向数组的指针,这个数组中有4个元素,但是&p是一个指向含有4个元素的数组的指针类型(int (*)[4]),借助二维数组中的行指针和列指针很好理解,与int **明显不匹配。
错误2:
如果在上面加上强制类型转换呢?
int p[]={1,2,3,4}; int **numbers=(int **)&p;加上强制类型转换后代码编译正常,但是运行直接出错。
下面列出完整的测试代码:
#include <stdlib.h> #include <stdio.h> #include <iostream> //打印矩阵 void printMatrix(int ** numbers,int rows,int columns){ for(int i=0;i<rows;i++) { for(int j=0;j<columns;j++) std::cout<<numbers[i][j]<<" "; std::cout<<std::endl; } } //生成矩阵 int ** generateMatrix(int rows,int columns) { int **numbers=new int*[rows]; for(int i=0;i<rows;i++){ numbers[i]=new int[columns]; for(int j=0;j<columns;j++) numbers[i][j]=i*columns+j; } return numbers; } int main(){ int **numbers=generateMatrix(4,5); printMatrix(numbers,4,5); //释放内存 for(int i=0;i<4;i++) delete [] numbers[i]; delete numbers; return 0;
标签:
原文地址:http://blog.csdn.net/u012501459/article/details/45395571