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会从内存池里提取一块合适的内存(连续的) ...
随机推荐
- sh_20_for语法演练
sh_20_for语法演练 for num in [1, 2, 3]: print(num) if num == 2: break else: # 如果循环体内部使用break退出了循环 # else ...
- php 解析json失败,解析为空,json在线解析器可以解析,但是json_decode()解析失败(原)
$str2='{"code":200,"datas":{"id":1,"coupon_id":"123&quo ...
- python-numpy-1
mean() mean() 函数定义: numpy.``mean(a, axis=None, dtype=None, out=None, keepdims=<class numpy._globa ...
- linux shell 值coredump suid_dumpable和 gdb解析coredump文件
可以设置产生coredump文件,设置dump文件命名非格式,生成dump文件的路径: linux # set suid_dumpable on if [ -e /proc/sys/kernel/su ...
- shell 之 用linux定时任务crontab和watchdog.sh脚本做软件看门狗
1.简介 看门狗的作用是定期检测服务正常运行,如果发现服务不在了,会重新拉起服务:linux中可以利用系统的定时任务功能crontab定期的去执行watchdog.sh脚本,而watchdog.sh脚 ...
- badboy——jmeter录制工具
web网站录制工具 输入网址:红点点被选中代表在录制,然后点点点: 然后导出: 在从JMETER打开:(注意,一定要填cookie)
- Nginx数据结构之红黑树ngx_rbtree_t
1. 什么是红黑树? 1.1 概述 红黑树实际上是一种自平衡二叉查找树. 二叉树是什么?二叉树是每个节点最多有两个子树的树结构,每个节点都可以用于存储数据,可以由任 1 个节点访问它的左右 子树或父节 ...
- 【软件工程】Alpha冲刺(1/6)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 了解了反馈机制的实现原理 确定好算法的框架 对接口的规范化进行学习 展示Git ...
- yum源问题
配置本地yum源 1.使用工具将iso文件上传到操作系统,或者直接挂载iso文件 2.配置yum #cd /etc/yum.repos.d/ 删除多余的repo文件 # vi /etc/yum.rep ...
- 理解JVM
1.JVM运行时数据区 2.方法区 方法区垃圾回收的条件:该类的所有实例(堆内存中)被回收:加载该类字节码的类加载器被回收:所有的类对象(如Student.class)的引用被回收 一般采用可达性分析 ...