令我困惑多时的二维指针分配问题总结

来源:互联网 发布:ubuntu kernel source 编辑:程序博客网 时间:2024/06/06 02:13

int a1[M][N];

int *a2[M];

int (*a3)[N];

int **a4;

都可以定义二维数组;但是区别很大。二维及多维数组与一维数组不一样,是必须动态申请和释放内存的。

都可以通过a[i][j]来访问。

 

     最难懂的是 int(*a3)[N]的理解。它的意义是"一群" 指针,
  每个指针都是指向一个 N 个整数的数组。分配好以后,Ptr 指向一片连续的地址空间,
  其中 Ptr[ 0 ] 指向第 0 个 N个整数数组的首地址,Ptr[ 1 ] 指向第
  1 个 N个整数数组的首地址。

 

 

分配内存如下:

   int a1[4][3];
    int *a2[4];
    int (*a3)[3];
    int **a4;
    int i,j;

 


//a2是一个大小为M的数组,存放指向int型的指针;当定义他的时候,编译器就分配了M个int指针型的内存空间
    for(i=0;i<4;i++)
       a2[i]=(int *)new int*[sizeof(int*)*3];

 //首先,a3是一个指针,指向一组(指向包含M个整型数据的指针)的指针

  a3=(int(*)[3])new int[sizeof(int)*12];
   
//在a4定义过程中,编译器并不对其进行内存的分配,因此必须自己管理其内存的分配。
    for(i=0;i<4;i++)
       a4=(int **)new int *[sizeof(int*)*4];
    for(i=0;i<4;i++)
       a4[i]=(int *)new int[sizeof(int)*3];

原创粉丝点击