范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

萌新咆哮!C里引用和指针到底有什么区别?

  我们在写代码的时候总是离不开函数,我们调用一个函数,得到一个想要的结果。这个过程好像自然而然,但有的时候又会遇到一些意想不到的问题让我们困扰。
  尤其是涉及到函数参数的时候,我们经常会搞不清楚,我们在一个函数内部修改它传入的参数,究竟有没有作用?怎么有的时候有作用,有的时候又没有?这背后究竟是程序员的幻觉还是编译器的bug?
  今天就和大家聊聊这个问题。
  一
  先来看一个开胃菜。   void test(int a) {   a = 5;   }   int main() {   int a = 3;   test(a);   printf("%d ", a);   return 0;   }   这是一段C++代码,有一个参数a,我们在函数当中修改了a的值,将它改成了5。那么请问,函数调用之前的a有没有发生变化?   我估计这个问题大家都能答得上来,答案是不会变化,外界的a还是3,不会变成5。   原因很简单,因为a虽然传入了函数里,但是传进去的是一个值拷贝。既然是一个拷贝,那么不论我们在函数当中对这个变量做什么,显然拷贝之前的值不会因此发生变化。   图片   二
  接着我们来提升难度,再来看一段代码。   void test(int *a) {   *a = 5;   }   int main() {   int a = 3;   test(&a);   printf("%d ", a);   return 0;   }   请问test函数执行之后,输出的结果还是3吗?   执行一下就知道了,答案不再是3,而成了5。   图片   如果大家学过指针,这个问题应该都能理解。因为指针传递是会影响原值的,我们可以把指针理解成账号。我们可以把账号拷贝很多次,但是无论是哪一个拷贝对这个账号的内容进行了修改,那么都会影响到账号本身。这就是为什么你女朋友和老妈只要知道了你的账号,都能删除你游戏库的原因。   如果大家还不明白,我们再来看一段代码。   void test(int *a) {   *a = 5;   }   int main() {   int a = 3;   int *b = &a;   test(b);   printf("%d ", a);   return 0;   }   这段代码就完美揭示了指针就是一个账号的事实,我们在调用test函数之前,首先创建了一个b指针,指向a。然后我们传入函数的是b指针,并不是a,但运行之后输出的结果仍然是5。   只要你愿意,你也可以试着多创建几个指针,不论创建多少个指针。只要它们都指向a,只要它们发生了改动,a也一样会改动。   到这里应该理解上都没什么问题,我们继续深入,再来看另外一个例子。   三
  请问这段代码的执行结果是什么呢?   void test(int &a) {   a = 5;   }   int main() {   int a = 3;   test(a);   printf("%d ", a);   return 0;   }   为了防止大家没看清,我来强调一下,在这段代码里,我们传递的不再是指针了,而是在参数的类型int后面加上了一个奇怪的符号&。这个符号我们在刚才创建b指针的时候也用到过,它代表取地址符。使用在参数传递当中表示传递的是一个引用。   如果大家运行这段代码会发现,得到的结果依然是5。   也就是说传递引用之后,我们在函数当中修改了参数值,对参数本身一样起作用。那么问题来了,引用和指针有什么区别呢?   关于指针和引用的区别,往深了讲又可以单独写一篇文章了,为了防止大家一下子记不住,我们今天不聊那么深入,只谈谈原理上的区别。   其实很简单,引用可以理解成别名。就好像现在的明星往往会起个艺名一样,不管是艺名还是原名,都指的是同一个人。比如张三起了个艺名叫李四,某天报纸报道李四明星出车祸了,那么张三会不会出现在医院里?显然会,因为他们是同一个人。   那么引用和指针有什么区别呢?   其实很简单,指针是附加的属性,是一种绑定关系。引用则就是一个账号的别名,就好比我们用手机号绑定账号,我们可以用手机号登陆操作账号。但是这种绑定关系是可以变化的,我们明天可以重新绑定另外一个账号,而引用关系是没办法解绑的。   我们再来看一个例子:   void test(int *a) {   int b = 10;   a = &b;   }   int main() {   int a = 3;   test(&a);   printf("%d ", a);   return 0;   }   在这段代码当中,我们传递了a的指针,但是在test函数里,我们给a重新指向了一个新的值。这就像是我们把手机号绑定了一个新的账号,和原先的账号解绑了。显然在这种情况下,原先的值并没有发生变化。所以输出的结果依然还是3。   四
  我们进一步理解一下,指针和引用本身是两个东西,两个完全不同的概念。   指针是一个额外的类型,它可以指向某一个变量的地址。而引用则单纯就是同一个变量,只不过换了个名字。比如int a = 3; int &b = a;,a和b两个变量不仅值相同,而且它们底层的内存也是共享的。所以a改变了b也改变了,b改变了a同样改变,就好像是明星的本名和艺名一样。   可能有人会觉得奇怪,int a = 3; int &b = a;这样写和int a = b = 3;有什么区别?难道不都是等于3吗?   答案是完全不同,后面一种写法a和b虽然都等于3,但是它们的内存是分开的,而前面一种写法则相反,内存也是共享的。   理解了指针和引用是两个概念之后,很多问题也就解开了。   比如sizeof操作,我们来看一个例子:   string a = "hello world";   string *b = &a;   string &c = a;   printf("%d ", sizeof c);   printf("%d ", sizeof b);   输出的结果一个是24一个是8,原因很简单,因为sizeof输出的是变量占用的内存大小。如果它对一个指针操作,输出的就是指针这个东西的大小,和它指向的内容没有关系。不论它指向什么,返回的都是8。而引用和本体是一样的,自然返回的就是本身的大小。   再比如自增运算,指针的自增运算和引用也是不同的。因为指针的自增默认是内存地址+1,也就是移动指针指向的内存位置。而引用的自增运算也就是变量的自增运算。   关于指针和引用还有很多很多要说,想要成为代码大牛,对于引用和指针的理解是必不可少的。今天的文章只是一个开胃菜,后面的内容更加精彩。

小R角真全面屏各种黑科技,小米MIX4真的回来了8月份,小米有款屏下摄像头旗舰机发布,至于是不是MIX之前还不确定,不过从今天数码闲聊站曝光的这张新机钢化膜看,基本可以确定,这就是MIX。真全面屏窄边框小R角,不按套路的一点,它极米科技引领科技前沿,极米H3S强大超前极米H3S是极米科技于2021年3月16日推出的一款拥有1080P全高清的智能投影。据了解,该产品在预售期间就获得了市场较高关注度,首批现货一经发售便迅速售罄,深受用户的喜爱。能够实力圈粉,揭秘王者荣耀的5V5团队作战哲学一大清早看到玩家们吵起来了。其实大可不必,两个游戏都有自己的玩家群体,玩好自己的游戏就是了,两个游戏都是好游戏,为什么要争吵呢?营销号也不要总是为了流量踩一捧一了。在团队竞技手游中8个神奇的小网站,原地开启新世界大门谁能知道我网上冲浪的时候,都在收藏夹里收藏了一堆什么奇奇怪怪的东西狗头今天就把这些奇奇怪怪,但又迷之有趣的网站分享给大家,一起来看看吧1。任意门打开这个网站,点LETSGO会被传送16个宝藏小众网站,带你看见更大的创意世界我从我收藏的一大堆网站中,整理出了这16个我根本离不开的网站!一各种大全网站1。配色大全dopelycolors一个神奇的配色网站,一打开就是花里胡哨的。点最下面的骰子,就可以随机9个暗藏惊险与刺激的网站,叩开你新世界的大门这9个暗藏惊险与刺激的小众网站,绝对能叩开你新世界的大门!1外表平平的3D作品合集这个网站乍一看平平无奇,就是一些图片展示嘛,但是当你随意点击一个图片进入后,哇靠惊呆了,全都是动态特朗普政府将小米列入黑名单,称其为中国军事公司虽然任期只有六天,但是特朗普政府已决定将另一家中国电子巨头放在黑名单上世界第三大手机制造商小米。美国国防部现将小米指定为中国军事公司,这意味着它现在容易受到特朗普禁止美国投资此类公特朗普政府将小米列入黑名单,小米港股开盘暴跌11任期只有六天,但是特朗普政府已决定将另一家中国电子巨头放在黑名单上世界第三大手机制造商小米。美国国防部现将小米指定为中国军事公司,这意味着它现在容易受到特朗普禁止美国投资此类公司的LCD党等到了,RedmiK30s已入网,定价比预期更低前段时间小米海外发布的小米10T的国行版,在今天正式入网,与猜测一样给到了Redmi,至于命名是K30S还是K30T暂不确定,不过从配置来看这款手机定位是与K30Ultra一个级别3299起,聊聊小米10S优势在哪小米10的基础配置,小米10Pro的双扬声器小米11的配色及哈曼卡顿音效小米10Ultra的ID设计,再加上骁龙870处理器,可以说小米10S是将历代好评的配置全部汇聚在一起,那么Windows电脑有哪些必装软件?这10款电脑神器,神了推荐10款免安装的电脑神器!免费看片儿官方电子书一键清理电脑快速检索文件每一款都强大的不得了!一便携版免安装工具1电脑清理工具GlaryUtilities便携版免安装!一款简洁但强
苹果首度接受台积电涨价台积电的涨价看起来毫无征兆,但作为需求方,只能忍气吞声的接受。苹果接受涨价包下台积电1215万片4nm产能。据供应链业者消息,苹果自研的新一代A16应用处理器已完成设计定案,将采用观察手机存量市场博弈高端争夺或更惨烈,折叠手机成奇招澎湃新闻记者周玲2021年落下帷幕,手机厂商度过了一个相对疲弱的市场,无论全球市场还是中国市场,增幅均为个位数,且全年缺芯和新冠疫情封锁给手机供应链带来了诸多困难和挑战。根据DIG中国网约车继滴滴后什么变化最近,滴滴在美国成功上市,没想到先是被查,再是下架,后又有美国律师又曝出集体诉讼,微信支付宝的滴滴小程序被下架,看起来这场风云好像暂时还过不去。滴滴下架这一波,不少网约车平台摩拳擦快手宣布加入春节红包大战,可瓜分22亿IT之家1月18日消息,又到了一年春节。支付宝集五福活动早已开启,京东也宣布拿下2022年春节联欢晚会独家互动合作项目送出15亿红包和好物。近日,快手App更新图标,宣布加入春节红长虹控股集团已掌握2K转16K技术1月17日,长虹AI实验室2021年度OpenHouse活动在四川绵阳举行。视频超分辨率全新语音IP自动化检测等多项行业领先技术首次亮相,部分技术已陆续应用于智能家电工业互联网等领国产APP走出去提速来源人民网人民日报海外版在日前举办的广州萤火虫线下动漫展会上,原神爱好者身着云堇角色扮演服装游玩。近日,在芬兰赫尔辛基街头,中国公司米哈游制作的游戏原神宣传广告海报占据醒目位置。以2021年度星标大奖揭晓30款产品入选1月18日,由百度APP与ZOL中关村在线联手打造的智享未来2021年度星标大奖颁奖典礼线上举办,2021年度星标大奖评选结果正式公布。首届星标大奖于2019年推出,以成为品牌进阶电商早报小米电商平台将停止运营得物回应产品不合格亿邦原创小米会员制电商平台有品有鱼将于3月17日终止运营小米旗下新国货会员制电商平台有品有鱼宣布将于2022年3月17日终止运营,届时用户将无法访问有品有鱼App及小程序。官方表示OPPOA97曝光,骁龙778G和5700mAh大电池加持,预计价格亲民近年来,中端机凭借着较为全面的配置和合适的价格成为了大多数用户的首选,OPPOA系列便是其中深受用户认可的机型。近日,网上刚好曝光了OPPOA97的相关信息,跟随小编一起来看看吧。vivo王牌再度出山!NEX新机首曝7寸超窄大屏骁龙86000大电池目前国内手机四大天王华为小米OPPOvivo,每一家都有自己的王牌系列。华为的Mate,小米的MIX,OPPO的Find,还有vivo的NEX。而相比上面三家,vivo的NEX名气苹果VRAR设备或采用双处理器8K屏幕售价超2000美元据国外媒体报道,苹果产品方面的资深记者日前表示,苹果内部已经讨论了传闻已久的VRAR设备的价格,可能会超过2000美元。在苹果VRAR设备的价格方面,此前曾有报道称将在100030