游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

C指针的10种经典应用场合

  都说指针是C语言的精髓,那指针究竟有哪些经典应用场合呢?
  指针有三大类:指向数据的指针,指向函数的指针和范型指针(void)。
  其经典的应用场合,可以分为以下10类:1与函数相关的使用
  1。1在函数中用作输出型参数,产生副作用(更新被调函数中的局部变量的值);
  1。2在函数中用作输出型参数,用于返回多个值;
  1。3在函数中用作输入型参数,指向复合类型,避免传值的副作用(性能损耗);
  1。4用做函数返回值,返回一个左值;
  1。5用于指向函数的函数指针,使用函数指针调用回调函数;
  2用于指向堆内存;
  3与void配合使用,用void来表示一个泛型指针;
  4用于指向数组名(数组指针);
  5用于指向字符串常量(字符串常量指针);
  6在数据结构中,用作链式存储;
  附加:在字符串、文件操作中跟踪操作位置;
  1与函数相关的使用
  1。1在函数中用作输出型参数,产生副作用(更新被调函数中的局部变量的值)includestdio。hvoiddemo(intap,intsize,intmax){maxap〔0〕;for(inti1;isize;i)if(ap〔i〕max)maxap〔i〕;}intmain(){intmax,ap〔5〕{1,2,8,4,5};demo(ap,5,max);printf(d,max);getchar();return0;}
  1。2在函数中用作输出型参数,用于返回多个值includestdio。hincludemath。hintequationSolve(doublea,doubleb,doublec,doublex1,doublex2){intdeltaaa4ac;if(delta0){x1(bsqrt(delta))2a;x2(bsqrt(delta))2a;return1;}elsereturn0;}intmain(void){doublex1,x2;if(equationSolve(1,3,14,x1,x2))printf(x1。2fx2。2f,x1,x2);elseprintf(无实根!);getchar();return0;}x12。27x25。27
  1。3在函数中用作输入型参数,指向复合类型,避免传值的副作用(性能损耗)includestdio。htypedefstructInventory{intsku;charname〔36〕;charunit〔12〕;charsupplier〔48〕;doubleprice;doublestock;}Inven;voiddemo(constInvenp){printf(Theamountsisf,pprice(p)。stock);}intmain(){Inveninven{123,carbanfibre,kg,uc,128,100};demo(inven);getchar();return0;}
  1。4用做函数返回值,返回一个左值includestdio。hincludemalloc。hincludestdlib。hvoidprintIntArray(voidarray,sizetlength){printf(Arrayatp,array);while(length){printf(〔zu〕atpp,length,arraylength,(arraylength));if((arraylength)){printf(d,(int)(arraylength));}printf();}}voidgetElement(voidarray,sizetindex){return(arrayindex);}intmain(intargc,charargv){constsizetn5;sizeti;nelementarrayvoidtestmalloc(sizeof(void)n);in;while(i){(testi)NULL;}Setelement〔1〕inttestData123;printf(testDataatpd,testData,testData);(test1)(void)testData;printIntArray(test,n);Prints123,asexpectedprintf(Array〔1〕d,(int)getElement(test,1));getchar();return0;}
  返回左值在C中应用比较多,特别是用引用来返回左值,如返回ostream,或重载〔〕、等运算符。
  1。5用于指向函数的函数指针,使用函数指针调用回调函数通用的冒泡排序函数的应用includeiostreamincludecstringusingnamespacestd;templateclassTvoidsort(Ta〔〕,intsize,bool(f)(T,T));calleeboolincreaseInt(intx,inty){returnxy;}callbackee1booldecreaseInt(intx,inty){returnyx;}callbackee2boolincreaseString(charx,chary){returnstrcmp(x,y)0;}callbackee3booldecreaseString(charx,chary){returnstrcmp(x,y)0;}callbackee4intmain()caller{inta〔〕{3,1,4,2,5,8,6,7,0,9},i;charb〔〕{aaa,bbb,fff,ttt,hhh,ddd,ggg,www,rrr,vvv};sort(a,10,increaseInt);for(i0;i10;i)couta〔i〕;coutendl;sort(a,10,decreaseInt);for(i0;i10;i)couta〔i〕;coutendl;sort(b,10,increaseString);for(i0;i10;i)coutb〔i〕;coutendl;sort(b,10,decreaseString);for(i0;i10;i)coutb〔i〕;coutendl;while(1);return0;}通用的冒泡排序函数templateclassTvoidsort(Ta〔〕,intsize,bool(f)(T,T)){boolflag;inti,j;for(i1;isize;i){flagfalse;for(j0;jsizei;j){if(f(a〔j1〕,a〔j〕)){Ttmpa〔j〕;a〔j〕a〔j1〕;a〔j1〕tmp;flagtrue;}}if(!flag)break;}}01234567899876543210aaabbbdddfffggghhhrrrtttvvvwwwwwwvvvtttrrrhhhgggfffdddbbbaaa
  2用于指向堆内存
  实质也是通过库函数(malloc。h)返回void指针。includestdio。hincludemalloc。hintdemo(intr,intc){intap(int)malloc(sizeof(int)r);for(inti0;ic;i)ap〔i〕(int)malloc(sizeof(int)c);returnap;}intmain(){intr3,c5;intapdemo(r,c);inti,j;for(i0;ir;i)for(j0;jc;j)ap〔i〕〔j〕(i1)(j1);for(i0;ir;i){for(j0;jc;j)printf(2d,ap〔i〕〔j〕);printf();}getchar();return0;}123452468103691215
  3与void配合使用,用void来表示一个泛型指针includestdio。hincludestring。hincludestdlib。hintswap2(voidx,voidy,intsize){voidtmp;if((tmpmalloc(size))NULL)return1;memcpy(tmp,x,size);memcpy(x,y,size);memcpy(y,tmp,size);free(tmp);return0;}intmain(){inta3,b4;swap2(a,b,sizeof(int));printf(dd,a,b);doublec3,d4;swap2(c,d,sizeof(double));printf(ff,c,d);getchar();return0;}
  4用于指向数组名(数组指针)includestdio。hvoidfuncP(intp,intr,intc){for(inti0;irc;i)printf((i1)(r1)0?2d:2d,p);printf();}voidfuncAp(int(p)〔4〕,intr,intc)intp〔〕〔4〕{for(inti0;ir;i){for(intj0;jc;j)printf(2d,((pi)j));p〔i〕〔j〕printf();}printf();}voidfuncApp(int(p)〔3〕〔4〕,intr,intc){for(inti0;ir;i){for(intj0;jc;j)printf(2d,((pi)j));(p)〔i〕〔j〕,体现解引用指针,产生副作用printf();}printf();}intmain(){intarr〔3〕〔4〕{0,1,2,3,4,5,6,7,8,9,10,11};intsizesizeofarrsizeofarr;在该上下文中,arr是数组的地址,其类型是int()〔3〕〔4〕funcP((int)arr,3,4);funcAp(arr,3,4);在该上下文中,arr是数组首元素的地址,其类型是int()〔4〕funcApp(arr,3,4);在该上下文中,arr是数组的地址,其类型是int()〔3〕〔4〕getchar();return0;}output:012345678910110123456789101101234567891011
  5用于指向一个字符串常量(字符串常量指针)constchardemo(){charsa〔〕Hello!;constcharspHello!;returnsp;}
  关于字符数组和字符指针可以图示如下:
  在字符指针数组,数组元素是一个字符指针,用于指向一个字符串常量,如:charpMonth〔〕{January,February,March,April,May,June,July,August,September,October,November,December};charweek〔10〕{Mon,Tue,Wed,Thu,Fri,Sat,Sun};charcolor〔〕{红red,橙orange,黄yellow,绿green,青cyan,蓝blue,紫purple};chargans〔10〕{甲,乙,丙,丁,戊,己,庚,辛,壬,癸};charzhis〔12〕{子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥};charanimals〔12〕{鼠,牛,虎,兔,龙,蛇,马,羊,猴,鸡,狗,猪};
  6在数据结构中,用作链式存储defineElementTypeinttypedefstructLNode{ElementTypedata;structLNodenext;}LNode,LinkList;
  附加:在字符串、文件操作中跟踪操作位置。
  如分割字符串函数strtok():
  charstrtok(chars〔〕,constchardelim);
  对该函数的一系列调用将str拆分为标记(token),这些标记是由分隔符中的任何字符分隔的连续字符序列。
  在第一次调用时,函数需要一个C风格字符串作为str的参数,str的第一个字符用作扫描标记的起始位置。在随后的调用中,函数需要一个空指针,并使用最后一个标记结束后的位置作为扫描的新起始位置。
  要确定标记的开头和结尾,函数首先从起始位置扫描未包含在分隔符中的第一个字符(它将成为标记的开头)。然后从这个标记的开头开始扫描分隔符中包含的第一个字符,它将成为标记的结尾。如果找到终止的空字符,扫描也会停止。
  标记的末端将自动替换为空字符,函数将返回标记的开头。
  在对strtok的调用中找到str的终止空字符后,对该函数的所有后续调用(以空指针作为第一个参数)都会返回空指针。
  找到最后一个标记的点由函数在内部保留,以便在下次调用时使用(不需要特定的库实现来避免数据争用)。includestring。hincludestdio。hintmain(){charstr〔80〕Thisiswww。runoob。comwebsite;constchars〔2〕;chartoken;获取第一个子字符串tokenstrtok(str,s);继续获取其他的子字符串while(token!NULL){printf(s,token);tokenstrtok(NULL,s);}printf();for(inti0;i34;i)printf(c,str〔i〕);return(0);}
  二进制文件的随机读写:
  在标记文件信息的结构体FILE中,包含3个标识文件操作位置的指针。typedefstructiobuf{charptr;文件操作的下一个位置intcnt;当前缓冲区的相对位置charbase;指基础位置(即是文件的其始位置)intflag;文件标志intfile;文件的有效性验证intcharbuf;检查缓冲区状况,如果无缓冲区则不读取intbufsiz;缓冲区大小chartmpfname;临时文件名}FILE;
  codedemo:includeiostream按记录分块读写文件includefstreamincludecstdlibincludecstringusingnamespacestd;classStudent{public:Student(void){}Student(intn,charnam〔20〕,floats):num(n),score(s){strcpy(name,nam);}voidsetNum(intn){numn;}voidsetName(charnam〔20〕){strcpy(name,nam);}voidsetScore(floats){scores;}voidshow(){coutnumnamescoreendl;显示通过的重载实现更自然}private:intnum;charname〔20〕;floatscore;};intmain(){Studentstud〔5〕{Student(1001,Li,85),Student(1002,Fun,97。5),Student(1004,Wang,54),Student(1006,Tan,76。5),Student(1010,ling,96)};fstreamiofile(stud。dat,ios::inios::outios::binary);if(!iofile){cerropenerror!endl;abort();}cout(1)向磁盘文件输入5个学生的数据并显示出来endl;inti;for(i0;i5;i){iofile。write((char)stud〔i〕,sizeof(stud〔i〕));stud〔i〕。show();}cout(2)将磁盘文件中的第1,3,5个学生数据读入程序,并显示出来endl;Studentstud1〔5〕;for(i0;i5;ii2){iofile。seekg(isizeof(stud〔i〕),ios::beg);iofile。read((char)stud1〔i2〕,sizeof(stud1〔0〕));stud1〔i2〕。show();;}coutendl;cout(3)将第3个学生的数据修改后存回磁盘文件中的原有位置endl;stud〔2〕。setNum(1012);stud〔2〕。setName(Wu);stud〔2〕。setScore(60);iofile。seekp(2sizeof(stud〔0〕),ios::beg);iofile。write((char)stud〔2〕,sizeof(stud〔2〕));iofile。seekg(0,ios::beg);cout(4)从磁盘文件读入修改后的5个学生的数据并显示出来endl;for(i0;i5;i){iofile。read((char)stud〔i〕,sizeof(stud〔i〕));stud〔i〕。show();}iofile。close();getchar();return0;}(1)向磁盘文件输入5个学生的数据并显示出来1001Li851002Fun97。51004Wang541006Tan76。51010ling96(2)将磁盘文件中的第1,3,5个学生数据读入程序,并显示出来1001Li851004Wang541010ling96(3)将第3个学生的数据修改后存回磁盘文件中的原有位置(4)从磁盘文件读入修改后的5个学生的数据并显示出来1001Li851002Fun97。51012Wu601006Tan76。51010ling96
  End

40岁韩国男星吸毒后通街跑被捕李尚宝嫌疑最大朴海镇惨受牵连韩国昨日(10日)爆出一名40多岁的男演员涉嫌在街上吸毒后乱跑及后于家中被捕的消息后,网民凭传媒提供的主演级、2006年出道等线索疯狂推测其真正身份,却令李茂生和朴海镇等同年龄……知识库软件应该具备的7个基本功能SaaS公司最大的业务挑战是:如何留住客户,客户与你达成合作关系后,如何让其与你继续合作,达成长期合作关系。对于SaaS产品,丢失客户的成本是很昂贵的,赢得一个新客户的成本是留……黄山又迎降雪冬游期间有优惠大皖新闻讯12月27日夜里9时,黄山风景区迎来降雪,至今天(12月28日)白天累计降雪量7。4mm,最大积雪深度7cm。据气象部门预报,今天夜里至明天白天,黄山风景区小雪转多云……英国生活水平或出现严重下降专家警告经济增长惨淡年代来临据英国《卫报》网站18日报道,英国财政大臣亨特日前公布最新财政预算时表明,该国经济已经陷入衰退,预计未来将持续收缩。英国政府预算责任办公室(OBR)最新经济预测报告显示,未来两……1971年,中国恢复联合国席位,欧洲仅有一张反对票,究竟谁投1949年10月1日,新中国成立,自此中国只有一个政府,那就是中央人民政府。为此我国领导人经常为了中国恢复联合国席位而努力,但是美国每次都从中作梗。一直到1971年,大势……交易15场5创生涯新高!毕竟是能单换KD的鹈鹕117112击败了老鹰全场CJ26投9中,拿到25分8助4板,命中率虽然不高吧,但整体表现确实相当不错。被交易到鹈鹕之后,CJ总计打了15场比赛,投篮命中率高达……长白天下雪燃来天定山御雪而行,体验速度与激情!想逃离都市的快节奏想没有了生活琐事没有了工作邮件只有纯粹的白雪在天地间浩浩荡荡铺天盖地的雪花飞扬曼舞未曾沾染任何的色彩直击心灵从山顶乘风御雪而行……孩子出牙慢出牙晚,不一定需要担心,除非出现以下情况孩子出牙是婴儿成长过程中的一个重要里程碑,但有些孩子出牙比较慢或者出牙晚,这让父母们担心孩子是否健康。本文将介绍孩子出牙的正常过程,以及需要关注的情况。孩子出牙的正常过程……利字当头捞金无下限,深情丈夫贾乃亮的结局早已注定演员不去演戏却成天研究直播带货捞金这可能就是绝大部分网友对贾乃亮的评价了甚至还有些网友这样讽刺道直播小王子不要考虑拍戏的事情好好带货就……刘强东的兄弟,京东配送员现状的故事刘强东曾经说过,京东的员工都是他的兄弟,其中也包括了京东物流的配送人员,刘强东还在京东还好的时候,京东配送员底薪1200,加上提成和高额的五险一金,几年前便能轻松达到上万工资。……震惊世界的八大奇迹,你去过几个?旅行,是为了心在路上今天我们来看看,世界的八大奇迹,你知道几个。一、埃及金字塔众所周知,金字塔是古代埃及法老的陵墓,金字塔分布广泛且大小不一,其中以吉萨高地上……回归训练!柳鑫宇为王诗玥拍照,画面定格瞬间,网友大柳要挨揍柳鑫宇和王诗玥是冰舞组合,他们在此次北京冬奥会中获得了非常出色的成绩,他们是亚洲唯一一对晋级到总决赛的队伍,此次在冬奥会中的成绩也创造了新的历史。在北京冬奥会结束以后,两人迎来……
双11捡漏大队,性价比真的高,你不该错过的三款数码好物就算再穷,今年的双十一我还是凑了波热闹,毕竟都是真金白银降下来的价格,不买实在对不起自己,所以很多日用品这些都是一买买一年的量,但是这些产品是不是真降还是套路,我是凑个热闹也没……15岁被赵本山看中,26岁嫁富二代,老公被判刑14年,毕畅后2015年,王小蒙毕畅不顾赵本山反对,执意要嫁给身价过亿的富二代隋宏洋,赵本山生气的说:所有人都不准参加她的婚礼。不听老人言,吃亏在眼前,王小蒙毕畅果然为此付出了惨痛的代……黄金,跌成这样该咋办?万事俱备,只欠东风,看来昨晚这个风,是屁风。其实昨天晚上的所有技术面,多空都是欠缺一个爆发点,刚好CPI撞到了枪头上,是大阳还是大阴,那就只能看它最终的公布结果了。……美丽风景不需要远行,凯捷带你感受身边的精彩很多时候,相信很多车友都会热衷于行驶,向远方去追寻,探索不曾拥有的美景,但其实我们身边依旧有不同的精彩,需要我们去探索,需要我们去欣赏,接下来就让我与凯杰为伴,去分享记录属于身……风口来了猪都能飞起来,风过了一地的猪下货以前叫非死不可现在叫Meta的那个公司又要裁员,计划再次裁员上万名员工,AI机器人扎克把这一裁员计划归咎给了世事艰难更高的利率导致经济下行,更多地缘政治不稳定因素导致经济波动,……2大不可饶恕叛徒!国乒主力帮日本战胜中国队,李娜前辈叛逃美国在中国体坛有很多优秀的运动员,这些优秀的运动员都为祖国争得了荣誉,但也有一些运动员却选择站在祖国的对立面,这是让大家感到非常不可思议的事情。在众多加入外国国籍的运动员里面,大家……欧冠夜巴黎7比2梅西破纪录,曼城闷平,米兰大胜,尤文出局头条创作挑战赛欧冠夜:巴黎7比2梅西破纪录,曼城闷平,米兰大胜,尤文出局欧冠之夜,好戏连台!倒数第二轮的比赛,到了最关键的时刻,各支球队都有什么表现呢?E组切尔西客……情人节,肾友可以吃巧克力吗?今天是情人节,巧克力作为甜蜜的象征,相信有许多人都收到了。但有人会疑问:肾友可以吃巧克力吗?答案是肯定的,当然可以!但巧克力的选择有讲究。主要原因有三:……孩子上学容易累,家长多给孩子准备这几道家常菜补脑还补钙孩子学习累家长一定要给孩子营养跟得上,很多家长都不知道给孩子做什么饭每天都在发愁,今天小慧分享给大家每周不重样的营养菜谱,孩子吃了营养又健康,补脑又补钙,做法超级简单,学会了给……深度北京这些公园,让风景触手可及春暖花开,正是踏青赏花的好时节。在北京,越来越多的公园拆除围栏,向市民敞开怀抱,成为便捷可及的绿色新空间。今天让我们走进这些无界公园,感受城市与美景的无缝融合。好风景不再……站在高处看首钢园来源:人民网人民日报海外版图:讲解员赵志永在演示当年的操作流程。本报记者刘少华摄图:站在首钢园,远眺滑雪大跳台和新首钢大桥。本报记者严冰摄图:首钢园三高炉和秀池夜景。袁德……微信这5个设置可不能再开着了,为了你的隐私安全,赶紧关闭吧不知道大家有没有这样的体验。微信总在陌生设备上登录?微信钱包总被自动扣钱?微信总是收到陌生人的好友申请?大家对平时最常用的微信安全知识了解多少呢?今天我……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网