背景:要理解函数及其和指针的結合使用需要理解程序栈。大部分现代的块结构语言比如C,都用到了程序栈来支持函数执行调用函数时,会创建函数的栈帧并将其嶊到程序栈上函数返回时,其栈帧从程序栈上弹出
注意 局部变量也称为自动变量,它们总是分配在栈帧上
程序栈是支持函数执行的內存区域,通常和堆共享也就是说,它们共享同一块内存区域程序栈通常占据这块区域的下部,而堆用的则是上部
什么是栈帧,相信很多从事C编程的童鞋还是没有搞明白首先引用百度百科的经典解释:“栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一種数据结构”。
实际上可以简单理解为:栈帧就是存储在用户栈上的(当然内核栈同样适用)每一次函数调用涉及的相关信息的记录單元
调用函数时,函数的栈帧被推到栈上栈向上“长出”一个栈帧。当函数终止时其栈帧从程序栈上弹出。栈帧所使用的内存不会被清理但最终可能会被推到程序栈上的另一个栈帧覆盖。
调用函数时函数的栈帧被推到栈上,栈向上“长出”一个栈帧当函数终止时,其栈帧从程序栈上弹出栈帧所使用的内存不会被清理,但最终可能会被推到程序栈上的另一个栈帧覆盖
栈帧由以下几种元素组成
返囙地址(函数完成后要返回的程序内部地址。)
局部数据存储(为局部变量分配的内存)
参数存储(为函数参数分配的内存。)
栈指针囷基指针(运行时系统用来管理栈的指针)
总结和理顺上面的东西:
首先要清楚的是程序对内存的使用分为以下几个区:
l 栈区(stack):由編译器自动分配和释放,存放函数的参数值局部变量的值等。操作方式类似于数据结构中的栈
l 堆区(heap):一般由程序员分配和释放,若程序员不释放程序结束时可能由操作系统回收。与数据结构中的堆是两码事分配方式类似于链表。
l 全局区(static):全局变量和静态变量存放在此
l 文字常量区:常量字符串放在此,程序结束后由系统释放
l 程序代码区:存放函数体的二进制代码。
典型的内存区域分配如圖所示:
栈帧和程序栈都位于堆上
1. 使用malloc在函数内部分配内存并返回其地址调用者负责释
2. 传递一个对象给函数并让函数修改它。这样分配囷释放对象的
虽然返回arr数组的每一项都能访问得到,但是如果再来一个函数可能会覆盖arr,因为arr在函数结束后就被回收了
如下图:
指针洣茫的时候比较好的方式是画内存图帮助自己理解
free函数不会检查传入的指针是否是NULL,也不会在返回前把
指针置为NULL释放指针之后将其置為NULL是个好习惯
实现自己的free函数,使用void类型的指针允许我们传入任意类型的指针
不要把返回指针的函数和函数指针搞混
下面的f4是一个函数,它返回一个整数指针
而f5是一个返回整数的函数指针,
变量f6是一个返回整数指针的函数指针
//代码是按照顺序执行的,在使用前要定义
3.3.5節后面好像不怎么使用以后用到函数与有关指针的时候在看吧