大一C语言学习笔记(8)---指针篇--动态内存是什么?与静态内存有什么区别?怎么使用动态内存,有什么需要注意的地方?
静态内存指的是在编译时系统自动给其分配的内存,运行结束后会自动释放;静态内存是在栈中分配的;
动态内存是我们程序员手动分配的内存,正常情况下,程序运行结束后,也不会自动释放,所以为了避免发生未知的错误,我们需要手动释放动态内存;动态内存是在堆分配的;
- 动态内存分配问题:
#include<stdio.h>
#include<malloc.h>//用于调用malloc()函数
int main()
{
int i=5;
//为变量 i 静态分配了4个字节的内存
int *p=(int *)malloc(4);
//将malloc()函数动态分配的4个字节的内存的地址赋给了指针变量 p
*p=5;
//把‘5’放到了指针变量 p 所储存的地址对应的动态内存单元中
printf("%d",*p);
free(p);
//记住在程序结束处一定要将动态分配的内存释放掉,因为正常情况下,动态分配的内存是不会随程序的结束而自动释放的
//所以为了避免未知的错误,在程序结束处,一定要用free()释放动态内存,一个malloc()对应一个free()
}
运行结果:
5
--------------------------------
Process exited after 6.594 seconds with return value 1
请按任意键继续. . .
1.用到动态内存分配时,需要调用:malloc(int i)函数,该函数储存在头文件<malloc.h>中;malloc()函数只有一个int形参,返回值为【第一个字节的地址】;
2.如图中的(int *)代表将malloc返回的字节地址强制为int *类型,至于为什么一定要强制转换,我的理解是:一个地址,是4个字节,而我们不知道用户使用这段malloc()开辟的空间用来储存什么类型的数据,所以调用malloc()函数是,要对其返回值进行不同类型的强制转换;
3.void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int)所以需要 int*强制转换,说明用来存储int类型数据!
- 理解动态内存的使用:(代码的目的是将 *p 存的100变为200)
#include<stdio.h>
#include<malloc.h>
void f(int *q)
{
//*p=200; //错
//q=200; //错
//**q=200; //错
*q=200;
//free(q); //错
}
int main()
{
int *p=(int *)malloc(4);
*p=100;
printf("%d\n",*p);
f(p);
printf("%d\n",*p);
}
运行结果:
100
200
--------------------------------
Process exited after 1.492 seconds with return value 4
请按任意键继续. . .
1.主函数中指针p 指向了一个动态内存,(*p=10)代表向p指向的动态内存放进了一个“10”;
2.这时printf(*p)自然是p所指向的动态内存中所储存的 “10”
3.流程控制进入子函数f(int *)中,f()先将p所指向的内存数据拷贝给了指针q,此时q也指向了动态内存中所储存的”10“,这时如果想改变动态内存中的数据,只能对*q进行操作,因为在子函数*p并没有定义;
4.也不能直接写”q=20“,因为q是指针,20是int,针型殊途啊;
5.**q更不对了,这种类型是从内向外运算的,q是指针,而*q是变量,而*又只能操作指针类型,所以**q自然属于语法错误;
6.子函数最后也不能free(q),因为我们要printf动态内存中的数据,若free(q),此时q所指向的动态内存被释放掉,再printf(*q)输出的自然是垃圾值(因为此时动态内存中没有手动储存数据)
博主只是一只小菜鸡,若文章有错误或不当之处,请狠狠批评博主 (~ ̄(OO) ̄)ブ
大一C语言学习笔记(8)---指针篇--动态内存是什么?与静态内存有什么区别?怎么使用动态内存,有什么需要注意的地方?的更多相关文章
- 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项
博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...
- 大一C语言学习笔记(7)---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?
"指针是C语言的灵魂"这句话一开始我没怎么明白,现在接触了指针,终于知道为什么这么说了,因为....难,真难:下面说一下我对这句话的见解: C语言拥有着其他语言所没有的特性---直 ...
- 大一C语言学习笔记(2)---快捷键篇
大家好,博主呢,是一位刚刚步入大一的软件工程专业的大学生,之所以写博客,是想要与同样刚刚接触程序员一行的朋友们一起讨论,进步,在这里记录我的一些学习笔记及心得,希望通过这些点点滴滴的努力,可以让我们离 ...
- 大一C语言学习笔记(9)---指针篇--从”内存的使用“和“流程控制”的角度来理解“指针变量的使用‘
#深入理解指针变量 举个错误栗子: //以下代码的目的是输出100和1000,但输出结果只有一个100 #include<stdio.h> #include<malloc.h> ...
- 大一C语言学习笔记(10)---编程篇--制作简易计算器,支持加,减,乘,除,取余运算,要求 0 bug
博主自开学初就一直在努力为自己的未来寻找学习方向,学习编程嘛,尽量还是要抱大腿的,所以我就加入了我们学校的智能设备研究所,别的不说,那的学长们看起来是真的很靠谱,学长们的学习氛围也超级浓厚,所以我就打 ...
- 大一C语言学习笔记(6)---自省篇--流程控制;break,continue,return间的异同;数组应用到循环语句中需要注意的问题;++i 和 i++的异同等。
下面是傻瓜博主"曾经"犯过的错和一些心得: ༼ つ ◕_◕ ༽つ 1.要想流程控制学好,一定要学会化繁为简,举栗子: 三目运算符 (略?略:略)---就是一个数字嘛, ...
- 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;
考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ...
- 大一C语言学习笔记(4)---自省篇
博主"曾经"做过的傻事: #你有的*没打全 #你用/的时候没考虑()是一对的 #printf随后加\n #所有变量只要用,就一定要定义数据类型 #sqrt()代表根号 #inclu ...
- 《C语言学习笔记》指针数组及其应用
C语言中,最灵活但又容易出错的莫过于指针了.而指针数组,是在C中很常见的一个应用.指针数组的意思是说,这个数组存储的所有对象都为指针.除了存储对象为指针,即一个地址外,其它操作和普通数组完全一样. # ...
随机推荐
- 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 百篇博客分析OpenHarmony源码 | v51.04
百篇博客系列篇.本篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | ...
- YbtOJ#482-爬上山顶【凸壳,链表】
正题 题目链接:https://www.ybtoj.com.cn/contest/116/problem/2 题目大意 \(n\)个点,\(x\)坐标递增,第\(i\)个点向第\(j\)个点连边. 开 ...
- YbtOJ#883-最大的割【带修线性基】
正题 题目链接:http://www.ybtoj.com.cn/contest/118/problem/3 解题思路 给出\(n\)个点,\(m\)次动态插入一条无向边询问:割掉一些边使得图中至少两点 ...
- asp.net core使用identity+jwt保护你的webapi(三)——refresh token
前言 上一篇已经介绍了identity的注册,登录,获取jwt token,本篇来完成refresh token. 开始 开始之前先说明一下为什么需要refresh token. 虽然jwt toke ...
- FastAPI 学习之路(五)
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) 我们之前的文章分享了 ...
- fpic 和 fPIC
fpic 和 fPIC 区别 Code Gen Options (Using the GNU Compiler Collection (GCC)) 综下所述,生成适用于共享库的位置无关代码(PIC)时 ...
- C++ 与 Visual Studio 2019 和 WSL
Visual Studio 使用 C++ 的 Linux 开发(WSL) https://devblogs.microsoft.com/cppblog/c-with-visual-studio-201 ...
- 初学python-day9 函数1(已更新)
函数 一.函数基础 1.什么是函数 在一个完整的项目中,某些功能会被重复使用,那么会将代码段封装成函数,当我们要使用的时候,直接调用即可. 函数是可以实现一定的小程序或者功能. 优点: 增加了代码的重 ...
- Noip模拟37 2021.8.12
T1 数列 真是考场上不是数学的乱推柿子,想定理,是数学的没想出来.. 比较悲伤... 列柿子不用动脑子,就是没有想出来$EXgcd$解不定方程,淦.. 解处一组解后利用比较显然的性质: $x+\fr ...
- SpringCloud微服务实战——搭建企业级开发框架(九):使用Nacos发现、配置和管理微服务
Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台,Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置 ...