二级指针分配内存(不小心晕了就来看一下)

C

    在c中可以这样:

    int **p;
    p=(int **)malloc(100* sizeof p);//sizeof p是一个指针的大小
    *(p+1)=(int *)malloc(10000*sizeof int);

    *(p+2)=(int *)malloc(90*sizeof int);


    另外关于p++会移动多少:

char**p1 = (unsigned char**) malloc(4*sizeof(p1));
printf("+0 %p\n",p1);
printf("+1 %p\n",p1+1);
printf("+2 %p\n",p1+2);
char* p2 = (char*)malloc(50);
printf("+0 %p\n",p2);
printf("+1 %p\n",p2+1);
printf("+2 %p\n",p2+2);
result:
+0 0x9040078
+1 0x904007c
+2 0x9040080
+0 0x9040090
+1 0x9040091
+2 0x9040092
    指针变量本身永远都是4bytes但是指针却有类型之分,就在于这种用法机制:指针变量+1结果是指针所存地址+指向的变量的类型的size。

    本例中p2指向空间存的是以char为单位的数据,所以该指针+1地址就+1;

    而p1指向空间存的是指针(虽然p1是char**,不要被迷惑哦)是以4为长度单位,所以该指针+1地址就+4。

    指针 p+n 约等于(非等价于,区别在于:p+n仍然是一个地址,p[n]则变成了 *(p+n),反正都是一些语法规则而已)p[n]所以有以下情况:

Struct buffer
{
void* start;
unsigned intlength;
}*buffers;

buffers =(buffer*)calloc (req.count, sizeof (*buffers));
for(int n = 0;n<req.count;n++)
{
    buffers[n].length= buf.length;
}

    这里buffers只是一个buffer类的指针(实际上是一个地址而已),所有可以有1:buffers->length= ...;和2:buffers[n].length = ...;两种用法。就像char *指向的地方可以是一个char也可以是一个字符串一样。





C++

1, int arr[4][5];
    这个是静态直接建立 内存连续
2,int (*arr)[5]=new int[4][5];
     动态分配 内存连续
3,int *arr[4];
  静态指针数组法,它是由指向一系列内存的指针组成,
  所指向的内存不一定连续
  如:
  int *p[4];
  p[1]=new int[5];
 p[2]=new int[100]; 
  if(p[1]&&p[2])
   {
    p[1][4]=0;
    p[2][88]=999;
     cout<<p[1][4]<<endl<<p[2][88]<<endl;
   }
4,int **p;
   动态二级指针法
   它指向的数组的多少可变,指向内存大小可变,
   内存可以不连续,但可以以连续的方式访问
   比如:
   int **p;
    p=new int *[100]; //指针数组的大小
    *(p+1)=new int [10000];//第二个指针指向的内存大小。
                         //也可以是这样:p[1]=new int [10000];
    p[2]=new int [90];//第三个指针指向的内存大小。
    if(p[1]&&p[2])
   {
    p[1][4]=0;
    p[2][88]=999;
    cout<<p[1][4]<<endl<<p[2][88]<<endl;
   } 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值