zoukankan      html  css  js  c++  java
  • 数组内存申请和释放,指针数组和数组指针


    总结

    对于指针数组的理解:
    按照字面意思,首先是指针,其次是数组,就表明这是一个数组,不过数组里面存储的指针。
    ```
    // 使用指针数组
    int **ptr = new int*[4];
    for(int i = 0; i < 4; ++i)
    {
    *(ptr+i) = new int [3];
    }
    ```
    如代码所示:new int * [4],表明这是一个数组,数组里面存储的是 int *类型的指针。
    而等号左值 int ** ptr,首先要看(int *)*ptr ,表明这一个指针,其指向了int *类型的变量。
    在看for循环内的内容,这是对数组内指针进行初始化,将数组内的每个指针指向了一个int[3]的数组,
    当然这里int [3],也可以改为int[4]等,当然也可以为数组内,每个指针,分别制定不等长的数组。


    对于数组指针的理解:



    参照一位数组指针的定义
    ```
    int * a = new int [3];
    ```

    ```
    // 使用数组指针
    int (*p)[3] = new int [4][3];
    printf("数组指针: p: %d &p[0]: %d *p: %d p[0]: %d &p[0][0]:%d "
    ,p,&p[0],*p,p[0],&p[0][0]);
    ```
    等号右值,都是数组,等号左值依然是int *p ,不过因为其实二维数组,所以
    在其后,增加了指示二维的[3],以表明,其第二维的维度为3


    问题:
    对于下面的代码:
    ```
    class myString;
    myString *pStringArray = new myString[13];
    ```
    以下两种delete有什么区别?
    ```
    delete pStringArray;
    delete []pStringArray;
    ```
    方括号的存在会使编译器获取数组大小(size)然后析构函数再被依次应用在每个元素上,一共size次。否则,只有一个元素被析构。


    博客原文:

    http://blog.csdn.net/xietingcandice/article/details/41545119

    ```
    //============================================================================
    // Name : TS.cpp
    // Author : jiudianren
    // Version :
    // Copyright : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================

    #include <iostream>
    #include <functional>
    #include <stdlib.h>
    #include <vector>
    #include <stdio.h>
    using namespace std;


    int main()
    {
    int * a = new int [3];
    printf("一维数组: a: %d *a: %d &a[0]: %d "
    ,a,*a,&a[0]);

    // 使用指针数组
    int **ptr = new int*[4];
    for(int i = 0; i < 4; ++i)
    {
    *(ptr+i) = new int [3];
    }
    printf("指针数组一步步申请: ptr: %d &ptr[0]:%d *ptr: %d ptr[0]: %d &ptr[0][0]:%d "
    ,ptr,&ptr[0],*ptr,ptr[0],&ptr[0][0]);

    // 使用数组指针
    int (*p)[3] = new int [4][3];
    printf("数组指针: p: %d &p[0]: %d *p: %d p[0]: %d &p[0][0]:%d "
    ,p,&p[0],*p,p[0],&p[0][0]);

    // 释放内存
    for(int i = 0; i < 4; ++i)
    {
    delete [] ptr[i]; //注意不要漏掉方括号
    }
    delete []ptr;

    delete []p;
    delete []a;
    return 0;
    }

    ```

    输出
    ```

    一维数组:
    a: 3615416
    *a: 3615824
    &a[0]: 3615416

    指针数组一步步申请:
    ptr: 3615440
    &ptr[0]:3615440
    *ptr: 3615464
    ptr[0]: 3615464
    &ptr[0][0]:3615464

    数组指针:
    p: 3615560
    &p[0]: 3615560
    *p: 3615560
    p[0]: 3615560
    &p[0][0]:3615560

    ```

  • 相关阅读:
    char*,const char*和string的相互转换[转]
    1.0到2.0 的变化
    Hello项目分析
    VS上编译Lua5.1.4生成静态库
    cocos2dx 自带动画
    asp.net2.0安全性(Login系列控件)
    用js实现的对css的一些操作方法
    mapxtreme开发小结3(c#)
    asp.net页面事件执行顺序
    access与SqlServer 之时间与日期及其它SQL语句比较
  • 原文地址:https://www.cnblogs.com/jiudianren/p/5672047.html
Copyright © 2011-2022 走看看