指针函数和函数指针的区别,用法,程序例子,C语言,Linux 一、指针函数 1、指针函数:首先它实质是一个函数;只是函数的返回值是一个地址量。 2、通常一个函数都有返回值,如果一个函数没有返回值,则该函数是一个无值函数。 3、指针函数一般形式: <数据类型> *<函数名称>(<形参说明>) { 语句序列; return [(表达式)]; } 其中: <数据类型> :例如 int(整型),char(字符型) ,float(浮点型),double(双精度)等等; 与返回值的数据类型保持一致。 <函数名称>: 符合标识符命名规则。(由字符,下划线,数字组成,且不能以数字开头)。 <形参说明> :是“ , ”分隔的多个变量的说明形式,通常简称为形参。 在<函数名称>之前的 * 符号,说明该函数返回一个地址常量。 return [(表达式)]:语句中表达式的值要和函数的<数据类型>保持一致,如果函数数据类型为void则可以省略或则无表达式结果返回(即写为:return ;) 4、举例: 注意:由于函数返回值是地址,故传递方式为地址传递,地址传递需要保证地址是有效的,需要没有被回收或释放掉的地址,否则会段错误,非法访问内存。
A、上图打印结果可以看出返回值是一个16进制的地址,并且该地址为字符数组ch的首地址。注:该地址被主函数调用并成功打印:表示该地址有效,可以正常访问。 B、如果去掉代码中的 static ,如下:
运行结果:这个时候不仅编译时系统会报警告:返回的地址无效,并且打印结果是空 ,这个时候主函数调用时就会非法访问内存了。 5、因此有以下几种方式在指针函数里面地址传递为有效的情况: A、static :静态存储类型,可延长变量使用周期,但仅限于本文件内,不可跨文件使用; 打印结果:成功打印hello world 字符串。
B、定义全局变量:
C、定义内部指针接收: D、malloc开辟的地址空间:需要用户自己释放或者所以程序运行完后系统才释放;(堆区地址)
二、函数指针 1、函数指针:实质上它是一个指针,只不过指针装的是一个函数的地址;函数地址是一个函数的入口地址。 2、当一个函数指针指向了另一个函数,就可以通过该指针来调用该函数,可以将函数作为参数传递给函数指针。 3、函数指针一般形式: <数据类型> (<*函数指针名称>)(<参数说明列表>) { 语句序列; } 其中: <数据类型>:函数指针所指向的函数的返回值类型保持一致; <函数指针名称>:符合标识符命名规则; (<*函数指针名称>):* 符号说明为指针,( )不可缺少,表明为指向函数的指针; <参数说明列表>:应该与函数指针所指向的函数的形参说明保持一致; 4、举例:
A、既然函数指针存放的是函数的地址,首先我们先打印看了一下这两个函数,计算机确实给函数名开辟了一个地址空间作为访问该函数的入口。 B、接下来便使用函数指针调用函数:
三、函数指针的重命名 用上面的例子简单做简单改写,说明一下;
四、总结 总的来说,函数指针和指针函数关键抓住它存放的和返回的是什么;整体看来的话,函数指针要比指针函数用起来简单一点,指针函数虽然看起来简单,但是类型多,容易出错,关于地址传递是否有效建议看虚拟内存图,了解计算机存储数据的方式。作为一个Linux嵌入式初学者,有什么问题,欢迎大家一起交流。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/31226.html