您的位置:首页 > 其它

指针和内存分配一个最基本理解

2015-07-12 11:12 197 查看
一个典型的C程序主要由预处理命令 #include + 主函数main()+ function a()+ 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函数全部执行完后,程序运行完了,就释放程序所占的全部内存。所以动态分配内存可以跨函数使用,因为不存在进栈和出栈,而静态分配内存在函数执行完后就出栈,释放内存,所以不能跨函数使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: