您的位置:首页 > 编程语言 > C语言/C++

C++内存动态分配和引用

2016-06-06 21:07 405 查看
1.动态内存分配

(1)

        1)C语言:malloc/calloc/realloc free

        2)C++:  new/delete运算符
                            new运算符用语动态内存分配, delete运算符用与动态内存释放

 c++:

     int* p = new int;

     *p = 100;

     delete p;

     -------------------

     int* p = new int(100);

     delete p;

     --------------------

     int* parr = new int[10];

     parr[0] = 10;

     parr[1] = 20;

     ...

     delete[] parr

    ---------------------- 

不能用二级指针接收二维数组的地址,错误使用:int** ppi = new int[3][4]

       如果定义二维数组需要用数组指针

        int (*ai) = new int[3][4] ;

(2)定位分配:

        再分配内存的同时指定起始位置,具体的语法格式如下:

        new (指针)  类型(初始值)

        主要用于指定起始位置 ;

              --主要用于指定起始位置

        定位分配的作用:

               定位分配的意义在于,

2.引用的概念和作用:

(1)引用和指针的区别:

          a.引用必须在定义的同时进行初始化,指针可以不做初始化 ;

          b.引用不能为空,指针可以为空 ;                 若const int &b = NULL ;//成立

          c.引用不能更换目标,指针可以更换目标;

          d.不能声明引用型数组,可以声明指针型数组

        (扩展)a.可以定义指向指针的指针(二级指针),但是不能定义指向引用的指针(要用引用的指针,不如直接用指针指向原来的值的地址)。

                         int a = 10 ;int *p = &a ;//ok

                         int **ppi = &pi ;//ok

                          int& b = a ;int& *ra = &b ;//error 

                        b.可以定义引用指针的引用(给指针起别名),但是不可以定义引用引用的引用(没有二级引用)

                         int a= 10 ;int *pa=&a ;

                         int *&ra = pa ;//ok

                       c.可以定义指针数组,但是不能定义引用数组,但是可以定义数组的引用 ;

                         int* arr[10]; // ok

                         int& arr[10]; // error

                         int (*pa)[10]; // 数组指针

                         int (&ra)[10]; // 数组引用  ok

(2)引用作为函数的形参有何作用

                           a.通过引用作为函数的形参,可以实现对实参的修改;

                           b.通过引用作为函数的形参,避免传递过程中数据的拷贝;

                           c.使用const修改函数的引用型形参,可以避免实参的意外修改,同时也可以接收表达式、字面值、常量等实参,因此以后的编程尽量使用引用和const;

(3) 引用作为函数的返回值

                          永远不要返回局部变量(包括函数的形参)的引用,但是可以返回静态局部变量/全局变量/动态内存/实参的引用/结构体中成员变量 的引用

                       

 int ival = 1024;int &refVal = ival; // ok: refVal refers to ival

int &refVal2; // error: a reference must be initialized

int &refVal3 = 10; // error: initializer must be an object
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: