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会从内存池里提取一块合适的内存(连续的) ...
随机推荐
- js监听transition过渡事件
html <div id="mydiv"> </div> style #mydiv{ width:100px; height:100px; backgrou ...
- 关于Additive Ensembles of Regression Trees模型的快速打分预测
一.论文<QuickScorer:a Fast Algorithm to Rank Documents with Additive Ensembles of Regression Trees&g ...
- AtCoder AGC032E Modulo Pairing (二分、贪心与结论)
题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_e 题解 猜结论好题. 结论是: 按\(a_i\)从小到大排序之后,一定存在一种最优解,使得以 ...
- CTF MD5之守株待兔,你需要找到和系统锁匹配的钥匙
这是提示 从系统锁下手,通过get方式key字段提交答案,直到您的钥匙与系统锁相等则成功. 点开链接可以发现有两串字符,而且系统的秘钥是一直在变化的 题目中已经给了MD5加密,那么用MD5解密发现您的 ...
- 0.JQuery学习
jQuery 教程 jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. jQuery 简介 jQuery 库可以通过一行简单的标记被添加到网页中 ...
- 【java测试】Junit、Mock+代码覆盖率
原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代 ...
- WebSocket-nodejs实现
一.环境配置 1.下载安装nodejs https://nodejs.org/en/download/ 2.安装完成后打开cmd命令,执行node --version,看看是否安装成功,如果 ...
- [Python]python-jenkins获取正在构建中的job
需求: 我现在需要完成1个接口,这个接口会启动jenkins构建jobA, jobA构建结束, 返回job的构建结果 思路: 首先使用get_job_info获取最后1次构建的构建序号,然后再通过ge ...
- 客户端服务器通讯常用的一种方法——Marshal类
这个类是.NETFramework2.0中的类,所以我们能够将其用于Unity中.与这个类类似的还有litjson等,可能是为了节省字节空间,Marshal类只仅仅将值进行打包成bytes流,而jso ...
- MySQL操作符与相关函数
union(联合)union使用是关联两张表或者两个查询所查出来的数据,联合成一张表但不会出现重复数据,显示的字段必须匹配列数. select s3.id cid,s1.cityName provin ...