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

来源:互联网 发布:java软件开发工程师 编辑:程序博客网 时间:2024/05/16 14:09

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

0 0