• 17. 堆上的二维空间与二维数组的异同的代码展示


    二维数组与堆的二维空间的异同
    堆上的二维空间,并不一定就是二维数组,只是具有数组的访问形式,但是其已经远远不是数组的定义了

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 #if 1
     5 /*在堆上创建一个内存分布与二维数组相同的二维空间,一级指针作为返回值*/
     6 
     7 void* alloc2dSpace(int base,int row,int line)
     8 {
     9     void *p = malloc(base*row*line);
    10     return p;
    11 }
    12 
    13 int main(void)
    14 {
    15     /*创建一个3*5*int的二维空间*/
    16     int (*p)[5] = alloc2dSpace(sizeof(int),3,5);
    17 
    18     /*使用方式与对二维数组的访问方式完全相同*/
    19     //初始化
    20     int i,j;
    21     for(i = 0;i<3;i++)
    22     {
    23         for(j = 0;j<5;j++)
    24         {
    25            // *(*(p+i)+j) = i+j;
    26             p[i][j] = i+j;
    27         }
    28     }
    29     //打印
    30     for(i = 0;i<3;i++)
    31     {
    32         for(j = 0;j<5;j++)
    33         {
    34            //printf("%d",*(*(p+i)+j) );
    35             printf("%d",p[i][j] );
    36         }
    37         putchar(10);
    38     }
    39     /*释放*/
    40     free(p);p = NULL;
    41 
    42 
    43     return 0;
    44 }
    45 #endif
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #if 1
     4 /*在堆上创建一个内存分布与二维数组不同与指针数组相同的二维空间,二级指针作为返回值,但在表面使用上却与二维数组访问方式相同,*/
     5 void** alloc2dSpace(int base,int row,int line)
     6 {
     7     void ** p = (void**)malloc(sizeof(int*)*row);
     8     int i;
     9     for(i = 0;i< row;i++)
    10     {
    11         p[i] = malloc(base*line);
    12     }
    13     return p;
    14 
    15 }
    16 
    17 int main(void)
    18 {
    19     int **p = alloc2dSpace(sizeof(int),3,5);
    20 
    21     /*使用方式与对二维数组的访问方式完全相同*/
    22     //初始化
    23     int i,j;
    24     for(i = 0;i<3;i++)
    25     {
    26         for(j = 0;j<5;j++)
    27         {
    28            // *(*(p+i)+j) = i+j;
    29             p[i][j] = i+j;
    30         }
    31     }
    32     //打印
    33     for(i = 0;i<3;i++)
    34     {
    35         for(j = 0;j<5;j++)
    36         {
    37            //printf("%d",*(*(p+i)+j) );
    38             printf("%d",p[i][j] );
    39         }
    40         putchar(10);
    41     }
    42 
    43     /*释放,由内而外释放*/
    44     for(i = 0;i<3;i++)
    45     {
    46         free(*p+i);
    47         //free(p[i]);
    48     }
    49     free(p);
    50 
    51     return 0;
    52 }
  • 相关阅读:
    不用加减乘除做加法
    数组中只出现一次的数字
    平衡二叉树
    二叉树的深度
    两个链表的第一个公共结点
    连续子数组的最大和
    最小的K个数
    数组中出现次数超过一半的数字
    二叉搜索树与双向链表
    复杂链表的复制
  • 原文地址:https://www.cnblogs.com/ZhuLuoJiGongYuan/p/9465062.html
Copyright © 2020-2023  润新知