指针和内存分配一个最基本理解
一个典型的C程序主要由预处理命令 #include + 主函数main()+ functiona()+function b()+….
C语言中的5类语句:declaration + assignment + function + control + null
在C语言中,所有变量在使用前都必须定义。
一维数组名:
一维数组名是个指针常量,它存放的是一维数组第一个元素的地址。
一个指针变量,无论它指向的变量占几个字节,它本身占4个字节,一个变量的地址是用其首字节的地址来表示的。
传统数组的缺点:
1、传统数组的长度要确定,且必须为长整数。
2、数组所占的内存,程序员无法手动的释放。只能在本函数运行完毕后,系统自动释放。
3、数组的长度一旦定义,其长度就不能更改。
4、A函数定义的数组,在A函数运行期间可以被其它函数使用。但A函数运行完毕之后,A函数中的数组就无法被其他函数使用。即:数组不能跨函数使用。
int * p = (int*)malloc(4) 中:
1、要使用malloc函数,需要添加头文件malloc.h头文件
2、malloc函数只有一个形参,且是整形
3、4表示请求系统为本程序分配4个字节
4、malloc函数只能返回第一个字节的地址。
(int *)表示强制类型转换!该语句分配了8个字节,p变量占4个字节,p所指向的内存也占4个字节。P本身所占内存是静态分配的,p所指向的内存是动态分配的。Free(p)是把p所指向的内存释放了,而p本身的内存是函数运行结束后,由系统自动释放的。
P变量只有是指针变量的时候才能在前面加*,若p变量是其他的普通变量,则一定不能加*!
内存分配:
【指针和内存分配一个最基本理解】动态内存是在堆中分配的,由程序员动态的申请和手动的释放。静态内存是在栈中分配的,由系统自动分配和系统自动释放。main函数在调用某个函数(比如f()函数)时,先将f函数的内容和所需参数压栈,如果f函数要调用g函数,则把g函数的内容和所需参数压栈,以此类推。等调用完g函数之后,就会把g函数出栈,释放g函数所占内存,然后继续执行f函数,f函数执行完后,把f函数出栈,释放f函数所占内存,最后执行main函数,等main函数全部执行完后,程序运行完了,就释放程序所占的全部内存。所以动态分配内存可以跨函数使用,因为不存在进栈和出栈,而静态分配内存在函数执行完后就出栈,释放内存,所以不能跨函数使用。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 急于表达——往往欲速则不达
- 第三节|第三节 快乐和幸福(12)
- 20170612时间和注意力开销记录
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 对称加密和非对称加密的区别
- 眼光要放高远
- 樱花雨
- 前任
- 2020-04-07vue中Axios的封装和API接口的管理