幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

C语言指针与函数

  C语言指针函数
  C语言指针函数就是函数中用到了指针的函数,主要是有以下两种方式以指针为参数的函数以指针为返回值的函数
  指针做函数参数
  学习函数的时候,讲了函数的参数都是值拷贝,在函数里面改变形参的值,实参并不会发生改变。如下图:
  每个函数都有一个独立的栈区,在函数传参的过程中,是把实参的值拷贝给形参,修改形参的值并不能作用到实参。如果想要通过形参改变实参的值,就需要传入实参的地址,可以通过寻址方式作用到实参上,如下图:
  想要修改实参的值,需要传入实参的地址,故想要修改该指针变量的指向需要传入指针变量的地址,也就是二级指针。多级指针中也是依次类推,数据结构中常有二级指针传参。
  示例程序传参的方式动态申请一维数组
  传参的方式修改一级指针的值,需要传入二级指针,通过寻址的方式修改一级指针,如下测试代码:includestdio。hincludeincludestdlib。hvoidcreateArray(intparray,intarrayNum){parray(int)calloc(arrayNum,sizeof(int));assert(parray);}intmain(){intpNULL;createArray(p,3);for(inti0;i3;i){printf(d,p〔i〕);}printf();return0;}
  运行结果如下:
  示例程序封装函数操作数组
  通常在封装函数操作数字类(int,float,double,)数组一定要传入数组长度,操作字符串类通常不需要,因为字符串存在字符串结束标记。例如封装遍历数组函数和字符串比较函数,代码如下:includestdio。hincludeincludestdlib。hincludestdbool。h等效voidprintArray(intarray〔〕,intarrayNum)voidprintArray(intarray,intarrayNum){for(inti0;iarrayNum;i){printf(d,array〔i〕);}printf();}intmyStrcmp(constcharstr1,constcharstr2){inti0;intj0;字符串比较从左往右比,找到不同的字符即可得到比较结果while(str1〔i〕str2〔j〕str1〔i〕!){i;j;}returnstr1〔i〕str2〔j〕;}intmain(){intarray〔5〕{1,2,3,4,5};printArray(array,5);printf(d,myStrcmp(string1,string)0);printf(d,myStrcmp(string,string)0);printf(d,myStrcmp(string,string1)0);return0;}
  运行结果如下:
  当然比较函数你也可以返回0,1,1,只需要在字符串比较函数中分类讨论下即可。
  指针做函数返回值
  指针当做函数返回值和普通函数一样,只是返回值类型不同而已,既然返回是一个指针,指针等效变量,故函数调用也可以等效变量。把指针当做函数返回值注意项:不要返回临时变量的地址可以返回动态申请的空间的地址可以返回静态变量和全局变量的地址
  当函数返回临时变量的地址时,地址中存储的数据随着函数调用完会被回收掉,导致获取垃圾值。如下测试代码:includestdio。hinttestFunc(){intnumber1314;returnnumber;}intmain(){intresulttestFunc();第一次数据做了保留printf(d,result);后续数据被回收了,垃圾值printf(d,result);printf(d,result);return0;}
  运行结果如下:
  在vs开发工具中会友善给予提醒,希望看到这类提醒当做错误处理,及时改善,友善提醒如下:
  示例程序返回值的方式动态申请一维数组
  可以返回动态申请的空间的地址,堆区内存需要调用free函数手动释放,如下测试代码:includestdio。hincludestdlib。hintcreateArray(intarrayNum){intp(int)calloc(arrayNum,sizeof(int));returnp;}intmain(){intpNULL;pcreateArray(3);for(inti0;i3;i){printf(d,p〔i〕);}free(p);pNULL;return0;}
  运行结果如下:
  示例程序用字符串初始化堆区内存并返回首地址
  其实和数字类的操作没什么太大区别,唯一要注意的是字符串申请统计长度用strlen,申请是可见长度加1,拷贝赋值用strcpy完成,如下测试代码:includestdio。hincludestdlib。hincludestring。hincludecharcreateArray(constcharstr){申请长度是可见度长度1unsignedintlengthstrlen(str)1;charp(char)calloc(length,sizeof(int));assert(p);不能直接pstr,语法没问题但是意义不同strcpy(p,str);returnp;}intmain(){charpstrNULL;pstrcreateArray(coolmoying);puts(pstr);free(pstr);pstrNULL;return0;}
  运行结果如下:
  C语言函数指针
  什么是函数指针
  如果在程序中定义了一个函数,那么在运行时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。获取函数地址有以下两种方式:函数名函数名
  既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。函数指针的唯一作用就是调用函数,函数指针没有和运算
  如何创建函数指针
  函数返回值类型(指针变量名)(函数参数列表);
  简单来说一句话,用(变量名)替换函数名,剩下的照抄即可,形参名可写可不写就是函数指针变量。如下函数的函数指针创建:
  如何通过函数指针调用函数
  函数指针可以通过不同的初始化方式,调用除了函数名不同,其他类型相同的所有函数。调用方式有以下两种:直接函数指针名替换函数名去调用函数(函数指针)替换函数名的方式去调用函数
  推荐使用第一种方式,代码看起来比较简单。如下测试代码:includestdio。hincludestdlib。hincludestring。hincludevoidtest(){printf(Test);}voidtest2(){printf(Test2);}intMax(inta,intb){returnab?a:b;}voidprintArray(int(p)〔3〕,introw,intcols){for(inti0;irow;i){for(intj0;jcols;j){printf(d,p〔i〕〔j〕);}printf();}}intmain(){创建函数指针变量void(pTest)()NULL;int(pMax)(inta,intb)NULL;参数名可省略void(pprint)(int()〔3〕,int,int)NULL;函数指针赋值两种方式即可pTesttest;pTesttest;pMaxMax;pprintprintArray;函数指针变量调用函数两种方式即可pTest();(pTest)();printf(d,pMax(1,2));intarray〔2〕〔3〕{1,2,3,4,5,6};pprint(array,2,3);调用除了函数名不同,其他类型相同的所有函数pTesttest2;pTest();return0;}
  运行结果如下:
  回调函数
  回调函数就是以函数指针作为某个函数的参数,函数指针比较重要的应用就是回调函数,在WindowsSDK,多线程,事件处理中大量用到回调函数。函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。简单讲:回调函数是由别人的函数执行时调用你实现的函数。通俗的讲:你到一个商店买东西,没有货,留给店员电话,有货了,打电话给你,然后你去取货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。如下测试代码:includestdio。hincludestdlib。hincludestring。hincludestdbool。hvoidget(){printf(取货成功!!!);}voidwait(){printf(等待售货员电话!。。。);}voidsalesperson(boolflag,void(Doing)()){if(flagtrue)有货{printf(通知取货);Doing();}else无货{printf(无货);Doing();}}intmain(){通常回调函数有关联的事件这里简单用有无货物来做salesperson(false,wait);salesperson(true,get);return0;}
  通常salesperson是第三方封装好的,我们只需要实现salesperson函数指针,通过salesperson去调用自己的函数,通常别人设计的回调函数都会绑定事件,目前初步接触了解下。运行结果如下:
  C语言万能指针充当函数指针
  万能指针充当函数指针使用前必须要强制类型转换,函数指针的类型就是去掉变量名即可,如下测试代码:includestdio。hincludestdlib。hvoidtest(){printf(调用成功!!!);}intmain(){voidptest;正常指针调用:p();test类型:void()()强转语法:(类型)(表达式)((void()())p)();return0;}
  运行结果如下:
  复杂函数指针解析
  右左法则
  首先找到标识符,然后往右看,再往左看,每当遇到圆括号时,就应该调转阅读方向,一旦解析完圆括号里面的所有东西,就跳出圆括号,重复这个过程直到整个声明解析完毕。
  示例1int(func)(intp)
  首先找到那个标识符,就是func,它的外面有一对圆括号,而且左边是一个号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int类型的形参,返回值类型是int。
  示例2int(func)(intp,int(f)(int))
  func被一对括号包含,且左边有一个号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int和int()(int)这样的形参,返回值为int类型。再来看一看func的形参int(f)(int),类似前面的解释,f也是一个函数指针,指向的函数具有int类型的形参,返回值为int。
  示例3int(func〔5〕)(intp)
  func右边是一个〔〕运算符,说明func是一个具有5个元素的数组,func的左边有一个,说明func的元素是指针,要注意这里的不是修饰func的,而是修饰func〔5〕的,原因是〔〕运算符优先级比高,func先跟〔〕结合,因此修饰的是func〔5〕。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int类型的形参,返回值类型为int。
  示例4int((func)〔5〕)(intp)
  func被一个圆括号包含,左边又有一个,那么func是一个指针,跳出括号,右边是一个〔〕运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int形参,返回值为int类型的函数。
  示例5int((func)(intp))〔5〕
  func是一个函数指针,这类函数具有int类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。
  示例6int(((func)(int))〔5〕)(int)
  func是一个函数指针,这类函数的返回值是一个指向数组的指针,所指向数组的元素也是函数指针,指向的函数具有int形参,返回值为int。
  实际当中,需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。应该用typedef来对声明逐层分解,增强可读性,如果对typedef不懂的,后续讲解。客观请留步
  如果阁下正好在学习CC,看文章比较无聊,不妨关注下关注下小编的视频教程,通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势。

任正非赌赢了!拜登做梦都想不到,制裁会来得这么快文文评科技在全球科技领域,美国一直都是手握大权,无论是科研实力、发明专利还是科技转换率,美国企业和科研机构在世界上都无出其右。但是随着中国经济的发展和社会的进步,中国的科……奇葩故事英超第一渣男沃克,性伴侣过百洗脑妻子出轨成瘾在红蓝交织的曼彻斯特,那里的黎明有海鸥啾鸣,浪花终日拍打码头,炸鱼薯条的香味丝丝渗入空气。近期,沃克则成为了这里的红人。提到英超渣男,首先映入脑海的会是谁?是给队友布里奇……30004000元买这几款手机性价比最高!安兔兔发布最新性价30004000元档位的手机是竞争最为激烈的,他们拥有相当不错的性能,同时价位又特别吸引人,因此能在这个档位把性价比做到极致的厂商和产品绝对值得这个价位段的相应用户闭眼入,而今……尴尬!曝中超俱乐部争抢泰国前锋,国足未来可能真要踢不过缅甸了金元足球的泡沫彻底破裂后,中超联赛跌入前所未有的低谷已经是一个不争的事实。在这样的大背景下,不少外援都因国内足球环境变得越来越差逃离中超。而如今很多的中超俱乐部也没有钱再……浙大和蚂蚁集团建智能视觉实验室,研究让机器人看懂世界3月29日,浙江大学和蚂蚁集团签署合作协议,成立智能视觉联合实验室。澎湃新闻(www。thepaper。cn)从蚂蚁集团获悉,该实验室致力于推进智能视觉的技术创新和产业应……李花怒放一树白,相约霞浦崇儒,锁住这个限量版的春天吧!李花怒放一树白,遥望疑是春飞雪春光明媚的三月万物都开始变得忙碌起来崇儒乡的李花也按捺不住她的热情最先感应到春天的召唤在暖暖的春风中悄然展颜千……甘肃省跨境人民币收付金额突破2000亿元中国甘肃网3月30日讯据兰州晚报报道3月29日,记者从人民银行兰州中心支行获悉,该行坚持聚焦服务实体经济、促进贸易投资便利化,积极推动全省跨境人民币业务提质增量,助力甘肃涉外经……多彩贵州花漾中国九市州联动,贵州的春天藏不住啦!春日里黔贵大地花团锦簇,生机勃勃次第绽放的樱花连绵成片的油菜花团团簇簇的李花置身其中,仿若人在画中游春日里黔贵大地一步一景步步皆……隔夜白开水是害人水吗?听说能致癌?隔夜白开水是否致癌一直是一个备受关注的话题。很多人都听说过隔夜白开水会致癌,但是这个说法是否正确呢?根据专家的研究,隔夜白开水并不会致癌,只要亚硝酸盐含量不超过国家标准即可。亚……重庆优化汽车消费补贴政策不再实行旧车置换,购新车最高补贴30重庆市商务委员会官网据重庆市商务委员会官网消息,为更好适应当前汽车消费市场形势,加大政策激励引导力度,进一步激发汽车消费市场活力,重庆决定对当前正在实施的新能源乘用车置换……什么叫失望性隔离心理学上有一种说法叫失望性隔离。通常来说是指跟父母不亲,不愿跟父母倾诉,遇到困难也不会向父母求助,从本质上来说是发自内心地不相信父母,觉得即使说了,也得不到想要的反馈。这……别再披头散发了,这3种人扎头发,比披发更显脸小我发现很多姐妹都会觉得自己脸型五官不够完美,就天天披头散发,以为这样就能把我们脸部的缺点全遮住,就是最显脸小的方法。非也非也。相反有些问题脸型,扎发会明显比披发显脸小好看……
疯狂马斯克特斯拉一降再降推特裁员75星链计划包围地球疯狂马斯克似乎到了人类控制不了的地步。因为没钱造汽车也靠自学马斯克的母亲曾经曝光一张马斯克24岁的照片,并表示当时人们觉得马斯克对汽车一窍不通。马斯克回复说:……创下近期价格新低后,金价昨夜反弹40美元盎司在美元空头的推动下,低迷已久的黄金价格在创下近期价格新低1614。59美元盎司之后突然开始飙升。北京时间9月28日晚间至9月29日早间,国际金价大涨超过40美元,于美市尾盘报收……小米12SUltra双十一直降600,小米与徕卡经典之作,也小米从成立至今,同样有不少经典机型,如小米2S、小米6等,都是小米钉子户机型,如今还有部分用户使用小米6,地位不输iPhone6S,都是一代经典。如今小米在高端旗舰手机市场也有……麦克托米奈在滕哈格的带领下,我认为曼联能去争夺些奖杯虎扑07月16日讯在昨晚结束的一场热身赛的比赛中,曼联在先丢一球的情况下连入4球逆转战胜墨尔本胜利队,取得了球队季前赛的两连胜。赛后,曼联中场麦克托米奈在接受采访时谈到了球队的……为什么旅游景点的东西贵,人们还要买?旅游景点的东西比较贵,但人们还是要买。为什么会出现这种现象?旅游景点比较封闭,不是在闹市就是在偏远的农村,要收门票。人们买了门票进去以后,就不能随便出入了。游览完了以后才……芯片禁令升级加速外企撤离!外媒看好中国突破封锁在一些西方国家眼里,全球分工明确:我国负责廉价、低端产业链,老美负责攻坚先进技术,这我们尝到了被剥削的苦,但近些年中国在科技领域的觉醒,让一些西方国家感到了后怕!比如进入5G时……国庆天府游丨去五凤溪,过一个浪漫的假期今天是国庆假期第四天,五凤溪古镇游人熙熙攘攘、热热闹闹,洋溢着欢度国庆的节日气息。十月的五凤溪,天高云淡、清风萦绕,满满的浪漫氛围感。踏着青石板路,漫步在伴山老街上,沉浸……意甲最新积分榜罗马3球完胜弱旅登顶,门将扑点AC米兰闷平今天凌晨,意甲联赛第4轮先战3场,国米主场31击败克雷莫内塞,巴雷拉传射建功,科雷亚和劳塔罗分别破门;罗马主场30完胜蒙扎,升至积分榜首位,迪巴拉梅开二度,完成新赛季首球;AC……郎平再获新的岗位,女排3黑马有望被提拔,蔡斌的信心也大增了郎平获得了新岗位,邀请蔡斌可以重点提拔三人,有望在世锦赛当中,帮助女排获得冠军证明自己。女排队伍当中,现在的两大教练,大家都是有很大的了解的。郎平帮助女孩做出来的贡献,非……中国市场太诱人了!德国机构呼吁减少对华依赖为未来制裁做准备路透社8月19日发表报道,称德国经济在2022年上半年对中国的依赖以惊人的速度增加。今年,是中国成为德国最大贸易伙伴的第七年,德国对中国的直接投资和对中国的贸易逆差在今年上半年……你手机里的UC还在吗?熟悉的小松鼠换了新造型不知道大家最近有没有发现,UC浏览器悄咪咪的迎来了自己的18周年,还更换了一个全新的LOGO?虽然官方似乎有些低调,但还是引起了广大网友和媒体的注意,随着全网讨论持续升温,小编……愿所有美好随秋风而来也许我们还在回味夏日缠绵的日子,炙热中带着花香,在浅浅的字里行间里都有炙热的痕迹,喜欢这火热的夏天,在这夏末初秋的渡口,纵有万般不舍,也只能默默地挥手告别,夏季悄然褪去,轻轻地……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网