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
(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
相关文章推荐
- C的读书笔记 --c语言概述
- 【天梯赛-初赛题】L2-004 关于堆的判断
- C++之*与->的重载
- Poco c++学习资料
- Will Go eventually replace C++ as Google hoped when Go came out?
- C++标准库,标准程序库,标准模板库之间是什么关系(重要!!!)
- 算法导论第八章-线性时间排序-Cpp代码实现
- C语言运算符优先级
- 3.1.深入理解指针1--什么是指针、指针符号 & *
- C语言学习---数据
- 全排列的生成使用C++的库函数:next_permutation
- C++第8次上机作业
- Reverse String
- C++之new和delete重载
- C/C++语言中const的用法
- 第一张节作业
- C与C++混合是出现连接错误,错误代码:1853
- C++多继承
- 【c++程序】栈的基本用法
- C++第7次作业