C++中一些散碎的知识点_int **指针与二维数组问题

时间:2019-09-03
本文章向大家介绍C++中一些散碎的知识点_int **指针与二维数组问题,主要包括C++中一些散碎的知识点_int **指针与二维数组问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

目录

1、int **指针与二维数组问题

1、int **指针与二维数组问题

01)定义二维数组方法:

int matrix[ROWS][COLUMNS];  //定义一个二维数组,其中ROWS和COLUMNS为常数

02)加入有如下声明的子函数:

void printMatrix(int ** numbers,int rows,int columns);

03)如果直接使用如下方法调用,是错误的;

printMatrix(matrix,ROWS,COLUMNS);  //直接这样调用时错误的

原因在于matrix是 int (*)[COLUMNS]类型的,但是函数printMatrix需要的是int **类型的,这两者明显不匹配。

int **从类型上讲是一个指向整型指针的指针,那么如果想要用它来表示一个矩阵需要怎么做呢?因为它的元素是一个指针,如果如果它的每一个元素都表示矩阵的一行,那么它就可以用来表示一个矩阵了。实现代码如下:

 1 //生成矩阵  
 2 int ** generateMatrix(int rows,int columns)  
 3 {  
 4     int **numbers=new int*[rows];  
 5     for(int i=0;i<rows;i++){  
 6         numbers[i]=new int[columns];  
 7         for(int j=0;j<columns;j++)  
 8                 numbers[i][j]=i*columns+j;  
 9     }  
10     return numbers;   
11 }
用int **来表示一个矩阵

把int*当做一个整体。它表示创建了一个大小为rows的数组,这个数组的每一个元素代表一个指针。内存布局如下:

这里numbers是一个指向指针的指针,能够用numbers用来表示矩阵的关键就在于使用new关键字分配的内存是连续的,这样number[i]的地址就可以根据numbers的地址计算出来,因为指针变量占据4个字节的内存区域(32位机器)。如果不使用上面的方式分配内存,numbers就真的只是一个指向指针的指针了

04)正确使用printMatrix(matrix,ROWS,COLUMNS)的测试代码:

 1 #include <stdlib.h>  
 2 #include <stdio.h>  
 3 #include <iostream>  
 4 //打印矩阵  
 5 void printMatrix(int ** numbers,int rows,int columns){  
 6     for(int i=0;i<rows;i++)  
 7     {  
 8             for(int j=0;j<columns;j++)  
 9                     std::cout<<numbers[i][j]<<" ";  
10         std::cout<<std::endl;  
11     }  
12 }  
13   
14 //生成矩阵  
15 int ** generateMatrix(int rows,int columns)  
16 {  
17     int **numbers=new int*[rows];  
18     for(int i=0;i<rows;i++){  
19         numbers[i]=new int[columns];  
20         for(int j=0;j<columns;j++)  
21                 numbers[i][j]=i*columns+j;  
22     }  
23     return numbers;   
24 }  
25 int main(){  
26     int **numbers=generateMatrix(4,5);  
27     printMatrix(numbers,4,5);  
28     //释放内存  
29     for(int i=0;i<4;i++)  
30             delete [] numbers[i];  
31     delete numbers;  
32     return 0;
View Code

 参考博客:

https://www.cnblogs.com/lpxblog/tag/C%2B%2B%E9%9D%A2%E8%AF%95%E9%A2%98/

原文地址:https://www.cnblogs.com/YiYA-blog/p/11456085.html