二级指针动态内存分配

指针是可变数组的首地址,正因为是可变数组,所以一般使用指针都是采用动态内存分配和释放的方式。一尾指针形式简单,容易理解,平时应用较多

二维数组和二维指针比较复杂,并且在动态内存分配与释放方面比较复杂难以理解,但是二维数组和二维指针是非常有用的

void func1(int**p1,int **p2)

{

    int **temp;

    int *temp1;

    int i;

     temp1=(int*)malloc(sizeof(jint)*20); //申请20个Int的空间

     temp=(int **)malloc(sizeof(int*)*20);//申请20个int*的指针空间

    for(i=0;i<20;i++)

   {

       temp[i]=&temp1[i];//对每个指针进行赋值

   }

    **temp=**p1;

}

 

定义如下3个二维数组和二维指针进行说明:

1.  int **ptr;   //内存占用4个自己,也就是一个指针

2.  int *ptr[M]; //neic 占用4*M个自己

3.  int (*ptr)[M];//占用4个字节

以上都是存放整数的二维数组,并且可以通过ptr[i][j]的形式访问内容,但是它们之间有很大差别,一些依照文中提到的方面

进行分析。

 

三个ptr本身都是指针,并且是二维指针,但是它们的最终内容总是整数,但中间内容,如ptr[i]并不是正式,而是指针int*

1.int**ptr 表示指向(一组指向整数数据指针)的指针

2.int *ptr[M]是指针数组,表示指向(M个指向整形数指针)的指针

3. int(*ptr)[M]表示指向一组(指向包含M个整形数据的指针)的指针。

int **ptr;

int i,j;

ptr=(int**)malloc((sizeof(int*))*M);   //长度为M每个都是一个指针

for(i=0;i<M;i++)

{

    ptr[i]=(int*)malloc(sizeof(int)*N);

}

采用如上内存分配方法,意味将Ptr初始化为M*N的二维数组首地址

可以访问ptr[0:M-1][0:N:-1];

for(i=0;i<M;i++)

{

   free(ptr[i]);

}

free(ptr);

使用上述方法分配内存,最终Ptr耗费的内存空间为M*sizeof(int*)+M*N*sizeof(int);

 

2.int *ptr[M]是指针数组,表示指向(M个指向整数指针)的指针,是一个二维指针,但是在定义的时候编译器已经为

ptr指向的M各指向整数的指针ptr[0:M-1]分配了内存,也就是说,定义之后即可得到ptr地址以及,要使用ptr必须对ptr[i]分配内存,分配内存之后,ptr地址

相应内存空间填入Ptr[i]指向内存地址,使用如下操作:

  int*ptr[M];

  int i,j;

  for(i=0;i<M;i++)

  {

      ptr[i]=(int*)malloc(sizeof(int)*N);

 }

采用如上内存分配方法,意味着将ptr初始化为M*N的二维数组首地址

for(i=0;i<M;i++)

{

    free(ptr[i]);

}

 

3.int(*ptr)[M]表示指向一组(指定包含M个整形数据的指针)的指针,该定义限定了Ptr[i][0:m-1],

指针必须指向长度为M的数组,

 int (*ptr)[M];

int i,j;

ptr=(int(*)[M])malloc(sizeof(int)*M*N);

for(i=0;i<N;i++)

{

   //ptr[i]=(int [M])malloc(sizeof(int)*M);

}

采用如上内存分配方法,意味将ptr初始化为N*M的二维数组首地址

free(ptr);

 

 

 

 

 

 

 

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值