C语言指针分配和释放空间:理解指针的两种“改变”,深入探讨指针值和指向的关系。
版权申诉
64 浏览量
更新于2024-02-18
收藏 277KB PDF 举报
& A; 2) ... 3) P = & B; 第 1 行代码,声明一个int类型的指针变量P。第 1 行代码,P 的值被改变为A 的地址,即P 指向A 。到第 3 行代码,P 的值被改变为B 的地址,即P 指向B 。这就是指针的第一种改变,即改变指针的值,实际上就是改变指针的指向。
20.1.2 改变指针指向的变量的值这是指针的第二种改变。需要借助运算符* 。以下是示例代码:int* P; int A; int B = 200; 1) P = & A; 2) ... 3) * P = 300; 第 1 行代码,声明一个int类型的指针变量P。第 1 行代码,P 的值被改变为A 的地址,即P 指向A 。到第 3 行代码,* P = 300,意思是P 所指向的变量A 的值被改变为300。这就是指针的第二种改变,即改变指针所指向的变量的值。
20.1.3 改变指针的值和改变指针指向的变量的值 这是指针的第三种改变。以上两种改变可以同时存在于一个程序中。以下是示例代码:int* P; int A,B; A = 100; B = 200; 1) P = & A; 2) ... 3) * P = 300; 4) P = & B; 5) ... 6) * P = 400; 第 1 行代码,声明一个int类型的指针变量P。第 1 行代码,P 的值被改变为A 的地址,即P 指向A 。到第 3 行代码,* P = 300,意思是P 所指向的变量A 的值被改变为300。到第 4 行代码,P 的值被改变为B 的地址,即P 指向B 。到第 6 行代码,* P = 400,意思是P 所指向的变量B 的值被改变为400。这就是指针的第三种改变,即改变指针的值和改变指针所指向的变量的值。
20.2 指针变量动态分配内存空间 变量的局部性是指变量能够存活的范围。而在函数调用中,本函数中定义的普通变量的存活范围为整个函数执行期间。一旦函数中的变量退出执行,变量就会被销毁,并且在再次调用函数时还需要重新创建变量。如果要在一个函数中定义的变量跨函数生存,可以将变量定义为静态变量。而指针变量所指向的变量的内存在堆区,其存活范围不会因函数的退出而结束。指针变量所指向的变量的内存在堆区分配,是在执行程序时其分配内存的。int* P = new int; * P = 200; delete P; 以上是动态分配内存的代码。第一行声明了一个int类型的指针P 。第 1 行代码,执行了int类型变量的动态内存分配,相当于调用了C 语言的malloc ()函数。P 指向一个动态分配的int类型内存空间。第 2 行代码,给P 所指向的内存空间赋值200。第 3 行代码,释放了P 所指向的内存空间。以上代码与静态变量声明效果是一样的,但原理不一样。
20.3 小结 回顾概括地说:1) 指针变量有两种改变:改变指针的值,实际上就是改变指针的指向,即指针的第一种改变;改变指针所指向的变量的值,即指针的第二种改变。2) 指针变量所指向的变量的内存在堆区分配,指针变量的内存在栈区分配。指针变量所指向的变量的内存空间的存活范围是整个程序执行期间。指针变量的内存空间的存活范围是函数执行期间。
20.4 练习题解析 1.分析打印a 的地址代码int a; cout << & a; 2.打印指针变量所占用内存空间,以及指针变量所指向的内存空间int* P; cout << sizeof(P); cout << sizeof(* P); 3. 将指针变量所指向的变量的值加1int* P; int a = 100; P = & a; ( * P) + = 1; cout << a; 4.使用指钍动态分配一组int类型的内存空间int* P = new int[5]; for(int i = 0; i < 5; i + +) P[i] = i; for(int i = 0; i < 5; i + +) cout << P[i] << endl; delete[] P; 5.编写一个程序,将程序执行过程中动态分配的内存空间超过系统空间的容量。程序崩溃。 提示:在第 4 题的代码基础上将内存动态分配的大小设为非常大,超过系统空间的大小。 6.编写程序,指定一个学生结构体,用 4 个指针分别指向学生信息,输出学生信息。 7.编写程序,将第 6 题的程序改为使用动态分配内存空间。".
2010-05-28 上传
2021-09-30 上传
2023-02-27 上传
2022-06-20 上传
2021-10-06 上传
czq131452007
- 粉丝: 2
- 资源: 12万+
最新资源
- SSM Java项目:StudentInfo 数据管理与可视化分析
- pyedgar:Python库简化EDGAR数据交互与文档下载
- Node.js环境下wfdb文件解码与实时数据处理
- phpcms v2.2企业级网站管理系统发布
- 美团饿了么优惠券推广工具-uniapp源码
- 基于红外传感器的会议室实时占用率测量系统
- DenseNet-201预训练模型:图像分类的深度学习工具箱
- Java实现和弦移调工具:Transposer-java
- phpMyFAQ 2.5.1 Beta多国语言版:技术项目源码共享平台
- Python自动化源码实现便捷自动下单功能
- Android天气预报应用:查看多城市详细天气信息
- PHPTML类:简化HTML页面创建的PHP开源工具
- Biovec在蛋白质分析中的应用:预测、结构和可视化
- EfficientNet-b0深度学习工具箱模型在MATLAB中的应用
- 2024年河北省技能大赛数字化设计开发样题解析
- 笔记本USB加湿器:便携式设计解决方案