zoukankan      html  css  js  c++  java
  • int **指针问题

    转自:http://blog.csdn.net/u012501459/article/details/45395571

    在打印二维数组时遇到了问题,二维数组可以这样定义int matrix[ROWS][COLUMNS],但是打印二维数组时函数的声明是void printMatrix(int ** numbers,int rows,int columns)。那么将matrix作为参数传递给printMatrix时会出现问题,因为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 **numbers=new int*[rows];这行代码开始怎么都看不明白,后来突然发现把int*当做一个整体看就明白了。它表示创建了一个大小为rows的数组,这个数组的每一个元素代表一个指针。内存布局如下:

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

    如果不使用上面的方式分配内存,numbers就真的只是一个指向指针的指针了

    下面列出几种numbers初始化错误的处理方式及错误的原因:

    错误1:

     1 int p[]={1,2,3,4}; 2 int **numbers=&p;  

    这种用法会报如下错误:error:cannot convert "int (*)[4]" to "int **" in initialization int **numbers=&p;

    原因是类型不匹配,p是一个指向数组的指针,这个数组中有4个元素,但是&p是一个指向含有4个元素的数组的指针类型(int (*)[4]),借助二维数组中的行指针和列指针很好理解,与int **明显不匹配。

    错误2:

    如果在上面加上强制类型转换呢? 1 int p[]={1,2,3,4}; 2 int **numbers=(int **)&p;  

    加上强制类型转换后代码编译正常,但是运行直接出错。

    下面列出完整的测试代码:

     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;  
  • 相关阅读:
    SharePoint远程发布Solution
    SharePoint Web Part Error – The Specified Solution Was Not Found
    Visual Studio 2013启用AnkSVN
    Using LINQ to SharePoint
    SharePoint配置搜索服务和指定搜索范围
    SharePoint 站点集和子站点数据互相读取
    SharePoint Backup
    Bootstrap滚动监听
    探索 SharePoint 2013 Search功能
    C#利用iComparable接口实现List排序
  • 原文地址:https://www.cnblogs.com/lpxblog/p/6986509.html
Copyright © 2011-2022 走看看