c语言函数指针有什么用(C语言中指针的作用是什么)
本文目录
C语言中指针的作用是什么
指针指向地址,指针的特性就是在地址不变的情况下,可以很方便的修改所指向的内容\x0d\x0a\x0d\x0a最重要的应用有两个,一是函数参数,二是函数指针\x0d\x0a函数参数:函数返回值只有一个,如果想回传多个参数,则必须使用指针\x0d\x0a函数指针:典型应用就是回调函数(callback)
C语言的指针有什么用
C里面函数都只能返回一个值,如果你的函数要返回两个值,那就要用指针了,把变量地址传进函数,然后把希望通过函数操作后想要的值存进传进来的变量地址里面。当然函数可以返回数组,结构体,但是你看多了你就知道,没有人会这么做的,都返回指针。试想如果我有一个1万个元素的数组,你会把它整个地传进一个函数里面或者整个地返回出来吗?C语言里面都是传值的,就是说传进函数的参数值首先被复制一边赋值给形式参数,你想想1万个元素,够呛咯!但是有指针就好多了,我们可以把指针(数组的第一个元素的地址)传进函数里面,有了开始地址,函数就知道东西在哪儿,就直接去那儿操作就可以了。单凭这一点,你就可以知道指针的威力,当然你也知道了指针一个很大的用处就是用于函数之间参数的传递与返回。指针就相当于一个代理一样,通过代理你知道了你要的东西在哪儿,你去那个地方就可以了,而不是需要把东西整个地板到你面前。
c语言为什么要有指针呢
因为指针通过地址传递参数,如果不用指针传送速度慢。
在没有C++语言的年代,没有面向对象、模板的语法支持,struct中还不能定义函数,用C语言想要对业务功能(算法,此处即指函数)进行抽象,不想依赖具体的数据结构/数据类型,此时就必须用指向函数的指针来实现抽象与具体的分离,
该函数的入参可以是void*,这样调用者就可以传入任意类型的参数了。后来有了C++,就用类成员函数和泛型(模板+functor)来代替了,这样做有更强的静态类型检查机制和编程约束,有利于减少滥用风险。
函数指针的一个典型应用场合是实现回调,因为此时还不知道具体函数定义,事件发生时才调用、才确定;类比于面向对象中的“多态”+设计模式中的“观察者模式”,回调的实质仍然是抽象。
扩展资料
C语言程序开发中,数组指针是有其独特的作用的,它可以用于限制函数接收指针索引的内存长度,利用编译器规范程序项目。在定义数组指针时,利用C语言的typedef关键字常常能够使代码更加易读:
typedef int Vector3d;
void transform(Vector3d *vector);
/* equivalent to `void transform(int (*vector))` */
...
Vector3d vec;
...
transform(&vec);
C语言指针的作用有哪些
指针的主要作用有两个方面: 1、指针就是地址,它和数组联系起来,可以方便的取数组中的值。 2、可以作为函数的引用。 指针的本质:一种复合的数据类型。 指针包括两个方面:一个是它本身的值,是一个内存中的地址;另一个是指针所指向的物,是这个地址中所存放着具有各种各样意义的数据。
求解释c语言函数指针的作用
上面的话是有道理的。只是,要真的体会这些名词,需要你亲历躬行,一个“百度知道”是很难让你真正体会并理解的。国人一些教科书也不负责任,人云亦云的说这些话,但很少能透彻讲解。我小试一下。1. 便于分层设计:函数指针是引用,是间接层,或曰隔离层。它输出到上层,给上层用户用。函数实体是实现,在下层,给开发者用,实现者(软件工程师)关注。这就是简单的分层的概念了。上层用户想让一个函数所做的东西会变化时,我们只需要改变底层实现,并用函数指针指向新的实现就行了。再精炼一下分层:分层的核心是对接口进行设计和实现。函数指针的作用就是提供不同实现的统一接口。2. 利于系统抽象:只有存在多个类似的实体需要模拟、操作或控制时(这种情况很多)才需要抽象。多个类似的实体就是对象,抽象的结果就是类。在C里边,可以用函数指针数组完成这种抽象。如, fopen 就是一个例子。他可以打开文件。C里面将磁盘文件、串口、USB等诸多设备抽象为文件。3. 降低耦合度以及使接口与实现分开:第1条中的解释已经说明了这一点。再具体一下:我曾搭建过一个嵌入式平台。其中的设备操作(硬件驱动)采用了多组函数指针数据,并进行了简单的封装,其结果是:业务软件使用函数指针数组的封装函数访问设备。这个封装可展示为:int DevOpen(char *strDevName);int Write(int DevID, char* DataFrom, int StartDevAddr, int DataLong);int Read(int DevID, char* DataTo, int StartDevAddr, int DataLong);int DevClose(int DevID);这组抽象出来的函数,是一组语义清晰且稳定的上层接口,为上层的业务开发团队使用。底层的驱动层,各自实现自己的设备打开、读、写及关闭代码,然后,注册自己的设备到系统列表里。上层业务接可以使用了。期间的耦合在这里:int Write(int DevID, char* DataFrom, int StartDevAddr, int DataLong){ /* Error detecting. */ return DevWrite( char* DataFrom, int StartDevAddr, int DataLong );}其中,DevWrite就是一个函数指针数组:int (*DevWrite)( char*,int,int ) = {0};里面放的就是多个设备的写的操作。其中包括:UART,RTC,WatchDog。EEPROM,DigitalInput,DigitalOutput,Key,LCD,LED。好了。说的太多了。如需要学习,可邮件livefuture@163.com。但愿对你有所帮助。
更多文章:
unchangeable(unchargeable中文什么意思)
2024年7月9日 07:05
gatsby(了不起的盖茨比中,Gatsby对Daisy为何念念不忘)
2024年6月23日 21:31
laravel auth认证(Laravel中Auth:guard表示什么意思)
2024年5月27日 19:54
非常后悔吃了几年的抗抑郁药(吃了四年抗抑郁焦虑药物现在非常镇静没有情绪没有情绪波动不会哭不会笑,是不是中枢神经被抑制了)
2024年7月21日 16:20
sales executive(sales executive position什么意思)
2024年6月23日 00:45
你们手机上除微信,QQ外还有什么聊天软件是值得推荐的?为什么有人能在不拿到我手机情况下,查我和谁聊天还有定位
2024年6月8日 18:46
select action怎么解决(struts2的表单标签select如何获取action传过来的list)
2024年8月21日 02:35
css中id和class区别(CSS中Class与ID的区别,Margin与Padding的区别)
2024年7月17日 21:22
replace函数替换身份证号(excel表格中怎么把身份证号中的2个数字替换)
2024年7月19日 13:10
数组公式按什么显示内容(excel 满足a条件显示b内容(非求和))
2024年7月18日 13:10