C语言随笔5:函数、函数指针
函数
C语言中函数参数传递时,将实参的值拷贝到函数参数的存储区中。这种传递参数的方式称为按值传递。
函数不会访问实参本身,访问的是函数存储在栈区的副本,不会改变实参.函数凋用结束,函数在栈区的内容释放.
若要改变实参本身.需用指针传递待修改变量的地址,使函数参数保存该变量地址的值。然后在函数中,通过参数保存的地址间接访问待修改的变量。大部分书籍,将这种做法称为按址传递或按引用传递。实际上,这种传递方式仍然是按值传递,只不过传递的是地址的值。
非void的函数,返回值不能做为左值.
因为函数返回值是常量,不是变量.
数组传递给函数:
不会保留数组的副本,保留的是数组首地址.的副本
常常有另一个参数一起传递进去,数组的末尾地址或者数组的长度。
函数指针:
存储函数首地址的指针变量.
函数名可以表示函数首地址.即表示函数的入口.
常作为函数的参数使用.
初始化办法:
Int f(char ,double)
Int (*p)(char, double ) =f;
//指针与函数需返回类型一致 int
//需参数列表一致 char double
int array[10] = {0};
int less1(int,int);//排序方式1
int greater(int,int);//排序方式2
int less2(int,int);//排序方式3
void sort(int*,int,(*)(int,int));
sort(array,10,less1) //int* int类型地址=int数组名,(*)(int,int) 两个int参数的地址=两个int参数的函数名 ,表示地址
//或将使用指针数组,初始化各个排序方式名字,再传参调用
sort(array,10,greater)
sort(array,10,less2)
函数的调用和递归
主调函数、被调函数
函数调用发生时,
主调函数的信息会作为一条活动记录入栈(瑞萨调试工具中可以看到过多层、后入先出)
活动信息:返回值,自动局部变量,函数名等
函数调用结束会将控制权返回给主调函数。
函数总能在多层嵌套的栈中找到其主调函数的信息
递归函数:直接或者间接调用自己的函数称为递归函数.需要设置正确的结束条件
内存分配:
注意 ‘返回栈内存’ 错误:
错误例:
u8 ex()
{
int p =233;
return p;
}
p是局部变量,在栈中,在外部调用时,局部变量的值已经销毁,返回一个无效值。
(可能跟编译器有关系,待确定
C语言随笔5:函数、函数指针的更多相关文章
- C语言 第八章 函数、指针与宏
一.函数 函数是一个包含完成一定功能的执行代码段.我们可以把函数看成一个"黑盒子", 你只要将数据送进去就能得到结果, 而函数内部究竟是如何工作的的, 外部程序是不知道的.外部程序 ...
- 【C语言】14-返回指针的函数与指向函数的指针
前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...
- C语言函数指针变量和指针函数以及指针数组
C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数.然后通过指针变量就可以找到并调用这 ...
- 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
- C语言的抽象与函数指针--思想(转)
一.何为抽象? 从小到大,我们接触到的抽象,最熟悉的莫过于数学了.为什么这样说呢? 比如说,在小学的时候,老师总是拿了几个苹果来引诱我们:同学们,这里有几个苹果啊?于是我们流着口水一个个地数,一个苹果 ...
- 【C语言】-返回指针的函数与指向函数的指针
本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.i ...
- C语言 命令行参数 函数指针 gdb调试
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
- C语言中函数和指针的參数传递
近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...
- C语言学习笔记--函数与指针
1. 函数类型 (1)C 语言中的函数有自己特定的类型,这个类型由返回值.参数类型和参数个数共同决定.如 int add(int i,int j)的类型为 int(int,int). (2)C 语言中 ...
随机推荐
- C#依赖注入 简体demo
class Program { static void Main(string[] args) { Dal dal = new MySql(); dal.Add(); Dal dal1 = new ...
- 如何处理pom文件中没有找到HUB检查到高危漏洞的依赖包
最近使用HUB工具检查到maven工程中存在高危险漏洞,虽然定位到具体的引用包了,但是在pom文件中却没有发现该依赖包.此时,我们就需要用到这条命令mvn dependency:tree,该命令会将m ...
- babel plugin
a = () => {}, // Support for the experimental syntax 'classProperties' isn't currently enabled ya ...
- BK: How to read a book 第一篇
第一章 阅读的活力与艺术 主动阅读 VS 被动阅读(新闻媒体) 作者与读者:投手与捕手的关系. 阅读的目标: 为获得资讯而读,以及为求得理解而读. 为获得咨讯而读,不会增加我们的理解力.比如阅读报纸, ...
- ZJOI2006 书架 lg2596
题面见https://www.luogu.org/problemnew/show/P2596 题面就是描述了一个书柜从上到下放着书,可以看作一个序列,每个数的序号为它在从上向下数第几本 一开始建树偷了 ...
- MySQL 8.0.18 在 Windows Server 2019 上的安装(MSI)公开
AskScuti MySQL : Windows Server 2019 安装 MySQL 8.0 温馨提示:为了展现我最“魅力”的一面,请用谷歌浏览器撩我.那个 IE 啊,我很无奈. 一切就绪,点我 ...
- Python标准库之shutil模块
高级的文件.文件夹.压缩包处理模块. 文件复制 copyfileobj 将文件类对象 fsrc 的内容拷贝到文件类对象 fdst. shutil.copyfileobj(fsrc, fdst[, le ...
- Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目,常用的项目如下 BeanUtils 提供了一系列对java bean的操作,读取和设置属性值等 map和bean的互相转换 我们 ...
- LINUX使用SSH远程终端时,如何将运行时间长的程序在后台挂起,下次SSH登陆时继续使用同一个SHELL?
我在某个平台上购买了一个云服务器,LINUX操作系统无图形化界面,硬盘空间较小.虽然在平台上可以通过其自带网页版VNC界面登陆SHELL进而操控云主机,但是每次需要操控都得打开网页登陆进平台,然后再进 ...
- AngularJS中transclude用法详解
这篇文章主要介绍了AngularJS中transclude用法,详细分析了transclude的具体功能.使用技巧与相关注意事项,需要的朋友可以参考下 本文实例讲述了AngularJS中transcl ...