C++学习 之 指针及动态内存分配(笔记)
1. 指针
1.1 指针的含义:
简单来说,指针是存储内存地址的变量。当我们声明了一个指针变量后,使用该指针时系统会根据指针内的地址索引内存块,读取内存内的值。指针因为是用来存地址的,所以一般固定长度为4个字节。void指针指向内存块的指针。
指针的定义示例:
int a=; int *Pointer_a=&a;
在编写程序时我们可以使用&(引用运算符或地址运算符)获取变量或常量的地址,例如上例中获取a变量地址就是用&a。对于指针来说指针本身存储地址,加上*(解除引用运算符)读取该地址下的值。如上例,Pointer_a存放的就是a的地址,*Pointer_a就是读取a的值。
1.2 指针的运算(++和--):
和数组具有相似之处,指针也可以进行地址运算。
我们可以用指针遍历数组试试:
int Array[]={,,,,};
int *p=Array;//Array存放的为数组的第一个元素的地址
for(int i=;i<;i++)
{
cout<<"Array["<<i+<<"]: "<<*p<<endl;
p++;
}
2.动态内存分配
2.1使用new和delete动态分配和释放内存:
new可以申请分配一个内存块(申请不一定会成功受限于系统的状态),如果成功则返回指向一个指针,指向分配的内存,否则会出现异常。delete用于释放new所分配的空间,当我们使用new分配的空间不在使用时,一定要及时释放否则会拖慢系统。
动态内存分配示例:
int* p, * p_copy, number = 0;
cout << "请输入需要存放的整数数量:";
cin >> number;
p = new int[number];//根据需要动态分配内存空间
p_copy = p;//存储p的初始地址
cout << "请输入各整数(用空格隔开):";
for (int i = 0; i < number; i++)//输入各整数
{
cin >> *p_copy;
p_copy++;
}
for (int i = 0; i < number; i++)//输出动态分配的空间内的各整数值
{
cout <<"第"<<i+1<<"整数为:"<<*p<<endl;
p++;
}
2.2动态分配内存空间的注意事项:
使用new分配内存空间后没有释放,导致程序运行时间越长系统越慢。要注意在new和delete的配合使用,否则会导致内存泄漏问题。在我们对原本有效的指针使用delete后指针便变为无效指针,此时指针为悬浮指针。还有就是指针在被定义之后没有指向内存空间或存储变量地址,这样的指针也是无效的。对无效指针解除引用程序往往会出现异常。所以,我们可以把指针初始化为NULL,使用前对指针是否有效进行检查。
2.3动态分配内存空间异常处理:
如果在使用new时分配不成功,将使得程序中断,并弹出错误窗口。对此我们可以编写异常处理程序,在分配成功时正常执行,不成功时也能妥善退出。
例如:
try
{
int *p=new int [];
delete [] p;
}
catch (bad_alloc)
{
cout<<"内存分配失败,程序结束"<<endl;
}
或者使用new(nothrow),在分配失败时返回NULL。
例如:
int *p=new(nothrow)int [0x1fffffff];
if(p)//检查p是否为空
{
delete [] p;//当p为空时,释放p的内存
}
else
cout<<"内存分配失败,程序退出"<<endl;
C++学习 之 指针及动态内存分配(笔记)的更多相关文章
- C++指针和动态内存分配
指针和动态内存分配 数组与指针 数组 数组名是一个指针常量. 数组名传递数据时,传递的是地址. 数组作为函数参数时不指定第一维大小. 对象数组 A a[2] = {A(1,2)}; 执行时先调用有参数 ...
- 数据结构基础——指针及动态内存分配(malloc)
一.指针 C语言中的指针是一种数据类型,比如说我们用int *a;就定义了一个指针a,它指向一个int类型的数.但是这个指针是未初始化的,所以,一般的,我们都在创建指针时初始化它,以免出错,在还不吃的 ...
- c++ 动态数组,指针与动态内存分配
教学内容: 内存的使用 动态内存分配malloc函数 分配内存时使用sizeof运算符 用指针访问内存 以数组的形式访问内存 一.内存的使用 堆(heap) 在程序执行期间分配内存时,内存区域中的这个 ...
- C++二维数组动态内存分配
对于二维数组和二维指针的内存的分配 这里首选说一下一维指针和一维数组的内存分配情况. 一维: 数组:形如int a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体 ...
- C++学习笔记(十一):void*指针、类型转换和动态内存分配
void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void ...
- <c和指针>学习笔记5动态内存分配和预处理器
1 动态内存 比如声明数组得时候,我们需要提前预估数组长度,分配大了浪费,少了就更不好操作了.从而引入动态分配,需要的时候再分配. (1)malloc和free void *malloc(size_t ...
- C和指针 第十一章 动态内存分配
声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...
- 《C和指针》 读书笔记 -- 第11章 动态内存分配
1.C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放,这些函数维护一个可用内存池. void *malloc(size_t size);//返回指向分配的内存块起始位置的 ...
- C动态内存分配(C与指针实例)
主要初步介绍malloc.free.calloc.realloc的基本.日后会有更详细的内容. malloc.free分别用于动态内存分配和释放. malloc会从内存池里提取一块合适的内存(连续的) ...
随机推荐
- ERROR 1130 (HY000): Host 'test177' is not allowed to connect to this MySQL server
异常 在测试环境新搭建的MySQL服务端,启动后登陆MySQL如下异常: [root@test177 ~]# mysql -u root -po2jSLWw0ni -h test177 mysql: ...
- 使用Telnet访问端口发送数据
什么是Telnet? 对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具.一旦入侵者与远程主机建立了Telnet ...
- IDEA下载安装及绿色方法
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- mysql java.sql.SQLException: The server time zone value '?й???????' is unrecognized or represents more than one time zone.
连接数据库时报错: The server time zone value '?й???????' is unrecognized or represents more than one time zo ...
- Ubuntu——关于以root权限操作和启用root账户的讨论
概括性的说,在Ubuntu下面,推荐用户加入到sudo之后,使用命令: sudo -i 来以管理员权限进行操作. 而不推荐用户直接登录root用户. 具体内参考:https://help.ubuntu ...
- koa 基础(六)应用级路由中间件
1.应用级路由中间件 app.js /** * 应用级路由中间件 */ // 引入模块 const Koa = require('koa'); const router = require('koa- ...
- css中的border-collapse属性如何设置表格边框线?(代码示例)
css中的border-collapse属性如何设置表格边框线?本篇文章就给大家介绍css中的border-collapse属性是什么? border-collapse属性设置表格边框线的方法.有一定 ...
- WPF Slider Tickbar 中显示数值
class CustomTickBar : TickBar { protected override void OnRender(System.Windows.Media.DrawingContext ...
- mariadb数据库(2)增删改与 单表查询
一.数据类型 MariaDB数据类型可以分为数字,日期和时间以及字符串值. 使用数据类型的原则:够用就行, 尽量使用范围小的,而不用大的 常用的数据类型 整数:int, bit 小数:decimal ...
- 如何优雅的给TDatetimePicker控件赋值(Delphi)
给DatetimePicker赋值时,可以通过界面设置赋值,也可以通过代码赋值. 通常,我们会给表示起始时间的dtp赋值为 00:00:00,给表示结束时间的dtp赋值为23:59:59. 代码如下: ...