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

一起学C程序设计第八课指针(一)

  C语言指针
  指针是C语言重要而且独特的一个概念。指针很灵活,学习指针必备的知识是要了解C语言中的数据存储方式。因篇幅有限,本节课先介绍指针的一些基本概念,以及用指针的方式去引用我们之前学过的基本数据类型、数组、函数等。
  注意,请认真学习完《C程序设计(第五版)》第八章后再阅读本文会有更大的收获。 指针
  指针即内存地址。变量在内存中初始化时被分配一个地址,之后再用到这个变量都是根据其地址找到对应的存储单元,再结合其数据类型进行取值。
  直接访问
  根据变量名来访问其在内存中的值。对于基本数据类型如整型、浮点型、字符型等一般都采用此种方式。
  间接访问
  把变量A的存储地址存在另一个变量B里,通过访问变量B获取变量A的地址,进而根据地址去访问A。指针变量
  定义
  用一个变量来存储某个数据的内存地址,那么这个变量就是指针变量。
  为了区别于普通变量,定义指针变量的时候加上一个星号"*",但指针变量的变量名不包含星号。
  引用
  定义一个指针变量后,我们可以给它赋值,赋的值自然要是一个指针,通常指针通过取址符"&"获取。指针变量的引用形式有两种:不带星号,引用指针变量自身的值,即存储的指针可以做指针相关的运算,或者重新赋值一个同类型的指针带星号,引用指针变量存储的指针对应的变量,即上述的"间接访问"变量,等同于对变量进行运算,或者重新赋值
  星号的位置
  目前两种主流的写法: int* a;  星号紧跟数据类型之后int *a;  星号紧挨着变量名
  这两种写法在编译时都能通过而且没有区别,主要是看个人习惯以及对指针变量定义的理解。
  在Visual Studio里默认星号紧跟数据类型,想修改的话打开"工具"->"选项"进行调整如下:
  调整指针的对齐方式
  作为函数参数
  指针变量作为函数参数的时候,实参传递给形参的是指针。改变形参的值不会改变实参,而通过"*p += 10"这样的运算则会改变其指针对应的变量的值,例如:
  指针参数作为函数参数
  在上面的代码里,指针变量p1和p2传入到fun1()函数中去做运算之后,并没有发生变化,而b的值却发生了变化,有疑惑的自己敲代码运行一下看输出和心理预期有没有出入。
  指针变量的指针
  变量的指针存储在指针变量里,指针变量和普通变量一样,也有它自己的指针,叫作指针变量的指针。
  上面这句话有点像绕口令,其实不难理解,我们打个比方:一个柜子有很多个颜色各不相同的格子,每个格子上贴有不同的字母标记,有一个金币放在标记为A的红色格子中;另外有一个标记为B的蓝色格子,里面放一张纸条并写有字母A,得出以下类比:所有格子都是变量,里面存的东西就是变量的值字母A表示红色格子的指针,即变量的指针蓝色格子存放字母A的纸条,即存放红色格子的指针,所以蓝色格子是一个指针变量字母B表示蓝色格子的指针,即指针变量的指针借助断点理解指针
  在Visual Studio编辑器中利用断点可以在指针变量赋值的过程中看到其值的变化,例如:
  借助断点理解指针
  以上代码里定义了两个指针变量p和p2:p是正确的定义方式,把变量a的内存地址赋值给pp2初始化定义没有问题,但是直接把整数11赋给p2是不对的;p2会把11转成16进制0x000000000000000b,然后根据这个地址找存储单元取值,结果自然是找不到的
  提示:初学者不太容易接受和理解指针这个新的概念,当遇到"指针"这个词的时候,心里自动把它转成"地址"来过渡。数组与指针
  通过上面的学习,初学者可能有点疑惑,基础变量的指针看起来好像就是引用的时候做一次转换,感觉不到特别有用的地方。接下来,通过指针引用数组就能体现出指针的便利之处了。
  数组的指针
  之前学习数组我们了解到:数组名就表示数组首个元素的存储地址,即首个元素的指针,也是数组的指针。
  存放数组指针的指针变量,定义的时候和基础变量的指针一样,前面声明数组的数据类型,如下几种定义数组指针的方式都是等价的:
  int a[10]; int *p1 = &a[0]; int *p2 = &a; int *p3 = a;
  数组指针的运算
  通过数组指针的运算来引用数组里的元素是我们学习的关键知识点。由于数组的在初始化的时候,被系统分配连续的内存来存储各个元素,所以知道了首个元素的指针p,通过加法运算得到第i个元素的指针p+i(i从0开始计数)。
  对于初学者来说,为了熟悉数组指针的用法,要多练习写一些不同条件的for循环和while循环去通过指针引用数组的元素,并实现数组的排序、找最大值、最小值等算法。
  数组作为函数参数
  之前已经学习过数组作为函数参数是,形参数组的变化会影响实参数组。函数的形参不管是数组,还是数组指针,它们都是等价的,同样实参传递数组和数组指针也是等价的。
  二维数组与指针
  以上是一维数组的指针相关特性,那二维数组的指针如何呢?和一维数组一样,二维数组的名字表示首个元素的指针。二维数组元素的指针引用比一维数组稍微复杂,但是只要记住一点,在指针运算中,一般先计算出行(第一维的数组指针)指针,再根据行指针里存储的第二维数组的首元素指针,例如二维数组a的i行j列元素为:
  a[i][j] = *(*(a + i) + j);
  对于二维数组a[m][n],我们定义一个指针变量p,p里指针指向一个一维数组且有n个元素,使得p指向a[0],p+1指向a[1],p+i指向a[i],p的指针指向a[0][0],是一个整型元素,则p+1指向的是a[0][0]的下一个元素a[0][1],这时a[i][j] = *(p + n*i +j);  相当于指针从a[0][0]开始按行逐个移动到a[i][j] 如果定义 int (*p)[n] = a ,p的指针指向a[0],是一个包含n个元素的数组,则p+1指向a[0]的下一个元素a[1],这时a[i][j] = *(*(p + i) + j);  相当于指针从a[0]先移动到第i行a[i],在移动到第j列a[i][j]
  这里注意的是,之前我们用的指针变量指向一个基本数据类型的变量,或者是一维数组内的(基本数据类型)元素,而这里定义一个指针变量指向的是一个一维数组,采用了新的定义方法:int (*p)[n];  ,虽然p也指向了一个数组的首元素,但p+i并不表示指向第i个元素,而是指向第i行。字符串与指针
  字符串赋值
  C语言可以直接用字符串赋值给一个指针变量,但是不能给一个指针变量直接赋值一个数组:char *s = "hello world"; 是可以的int *p = { 1, 2, 3 }; 是错误的
  这个与C语言对字符串的特殊对待方式有关,C语言对字符串按照常量字符串处理,并为其开辟字符数组来存储,所以有了存储地址就等于有了指针了,而一个数组就没有这个待遇了~
  字符指针的引用
  和数组指针类似,自身也可以做指针运算,引用字符串中某一个字符,或者改变字符串中某一个字符,但是注意直接赋值给指针变量的字符串是不能改变其中的字符的,如下代码:
  字符指针
  因为str指针是直接字符串赋值,而C语言这种处理方式是把字符串作为常量存储在内存中的,故不能改变常量的值,只能引用。
  字符指针作为函数参数
  字符数组也是数组,因此形参改变也会影响实参。函数与指针
  函数指针变量的定义
  函数指针变量定义形式:数据类型 (* 指针变量名)(函数参数列表); 例如
  void (*p)();
  这里定义指针变量时也用括号把星号和变量名包含起来,再结合之前我们定义一个一维数组指针也是用括号包含星号和变量名,即可得知复杂类型数据的指针变量定义都要注意这点,其主要原因是星号的优先级普遍偏低。
  注意的是函数指针变量指向函数体存储的入口地址,对函数指针变量做运算没有意义。
  函数指针变量作为参数
  有点类似于"函数式编程"的意思,比如JavaScript的回调函数,在一些高级语言中都有类似的"回调"语法规则。
  函数指针的使用
  在使用函数指针的时候,无论是直接调用还是当做参数传递到其他函数中调用,我们来看下面几种写法:
  函数指针的调用
  上面代码中的5种调用都能执行,而且结果一致,是不是有点疑惑呢?答案就在打印输出的地址中——指向函数的指针和函数里的指针是一致的。
  类比上面格子的比喻,可以这样理解:标记为A的红色格子里面存放的纸条也写着A,所以无论你是从颜色(红色)找格子,还是从格子的标记(A)找格子,还是从格子里的纸条标记(A)再去找格子,最终找到的都是标记为A的红色格子。
  初学者可能一时半会理解不透彻,可以去网上搜索"函数指针星号调用"查阅更多的资料。
  函数返回指针
  上一课学习函数,我们了解到函数的返回值要么为空,要么是一种基本的数据类型。如果返回一种基本数据类型的指针是否可行呢?答案是肯定的。
  为了区别于普通自定义函数,我们在返回的指针函数定义时,在函数名前加一个星号:返回数据类型 *函数名(参数列表);
  在使用的过程中,因为要接收函数的返回值,所以要定义一个同等类型的指针变量来作为函数返回值的赋值对象。下面是一个相当于字符串截取的参考示例,返回一个字符指针:
  返回指针的函数指针数组和指向指针的指针
  指针数组
  指针数组指的是一个数组里的元素都是指针类型的数据,定义形式为:数据类型 *数组名[数组长度];
  注意:区分和指向一维数组指针变量的定义区别。
  指针数组最常用的使用场景是处理字符串数组,如果按照普通的二维数组去定义一个字符串数组是非常麻烦的,因为二维数组要制定列数,但是每个字符串(字符数组)的长度都不相同,有长有短,这样会造成存储空间的浪费,如果把字符串(字符数组)用字符指针代替存储到数组里,就能很好的解决这个问题了。
  指向指针的指针
  如果一个指针变量里存放的指针指向的不是一个具体的值,而是另外一个指针,那么这个指针就是"指向指针的指针"。继续拿格子举例:红色格子里存放纸条B,纸条B对应蓝色格子,而蓝色格子里又存放了纸条C,纸条C对应绿色格子,绿色格子里存放着金币,那么可以这么说:蓝色格子里存放金币所在格子的指针C红色格子里存放指向"指向存放金币格子的指针C"的格子的指针B指针B就是一个指向指针C的指针
  main()函数的默认参数
  在执行编译好的exe文件可以加上参数,main()默认两个参数:int argc,参数的总数量,至少为1个参数,就是执行的当前文件的路径char *argv[],参数组成的指针数组,即运行命令后跟的参数,以空格来隔开
  可以在Visual Studio的项目配置里添加调试参数,点击"调试"->"你的项目名+属性调试"(最下面一个菜单),如下图所示:
  添加外部调试参数总结
  本节的知识点比较多,几乎是用指针把前面所学的东西又重新表达了一遍。使用指针要多练习,特别是二维数组指针的使用,很容易把定义一个指向一个一维数组整体的指针和一维数组首元素的指针搞混淆。
  使用指针有时候能巧妙地解决一些复杂的问题,不要为了使用指针而使用,要保证程序的可读性和代码的可靠性,不必要故意写那些让人费解、故弄玄虚的代码。往期文章
  一起学《C程序设计》第七课——函数及实战练习
  一起学《C程序设计》第六课——数组、字符串及实战练习
  一起学《C程序设计》第五课——循环控制及实战练习
  一起学《C程序设计》第四课——if语句、switch语句及实战练习
  一起学《C程序设计》第三课——数据结构、运算符、表达式和语句

互联网家政保姆月嫂家政月嫂服务,是指通过家政服务中介机构和家政服务人员双方的有效合作,为客户提供保姆月嫂保养产后护理婴幼儿照护家庭生活服务等家政服务项目。在实践中,通过充分利用互联网技术,家政服务中华为HDC倒计时十天鸿蒙开发者介绍理科生浪漫属性App诞生记帮助别人舒缓心理压力的人,不一定是心理医师。正就读于电子信息系的韩凤坤,是鸿蒙公开课优秀学生代表,也是星语App的开发者。据韩凤坤介绍,有别于其他的树洞类应用。这款App不强调重度量子通信又一世界纪录248公里的跨国纠缠分发光子盒研究院出品近日,维也纳量子光学和量子信息研究所的研究人员成功在奥地利到斯洛伐克248公里的跨国电信光纤中直接分发偏振纠缠的光子对,这是迄今为止基于真实世界光纤的纠缠分发的最长桑迪亚(Sandia)团队构建冷原子干涉仪的核心组件LPAI传感器头的横截面效果图。a,水平横截面显示具有固定光学元件的冷却束和原子检测通道。冷却通道光通过偏振保持(PM)光纤传递到传感器头,从中可以使用大准直高斯光束(D1e228将极化子捕获在工程量子盒中构建量子盒的关键是在较大层的顶部放置小2D材料,从而在较小层的边界内创建潜在井。澳大利亚研究人员为二维材料中的极化子设计了一个量子盒,实现了大极化子密度和部分相干量子态。来自新技术我国建立首个极深地下实验室!寻找暗物质科幻网10月25日讯(金恺祎)据央视网,为了研究深空中的暗物质,中国建立了首个极深地下实验室中国锦屏地下实验室。这个实验室垂直岩石覆盖达2400米,是世界岩石覆盖最深的实验室。它的深圳大学何传新教授团队在镁离子可充电电池研究获进展近日,深圳大学化学与环境工程学院何传新教授课题组在MaterialsToday(影响因子31。041,中科院JCR1区)上发表了题为ElectrochemicalSwellingI为了钱甘愿跟着大老板的那个姑娘,为什么过得最惨?俗话说有钱人能使鬼推磨,钱虽然不是万能,但是没有钱是万万不能的。在现在这个繁华的世界里,很多人都会钱财而迷失自我。一些人会选择沉醉其中,不愿醒来。而一些人会保持清醒的头脑,不忘初心近3天北向资金最大买入100股名单更新日期10月25日近3天北向资金净买入最多的100股序号代码名称最新价北向净流入市值增幅占流通股比所属板块1hr002466hr天齐锂业93。24。41亿11。773。03能源金大连人vs武汉三镇谢晖是压出去,还是收回来,考验教练智慧压出去打,一度成了大连人队的代名词,似乎成了谢晖指导的标签。压出去打是个伪命题,它即不是一种战术体系,也不代表一种风格,只是比赛过程中,当机会出现的时候,要善于抓住对手漏洞,敢于亮舞蹈之路,那一天,我好难忘舞蹈之路,那一天,我好难忘夕阳在天边渐渐沉沦,多姿的迎春花在枝头绚烂着永恒。回首我的舞蹈之路,那一天改变了她,总在心中脉脉浮动着暗香,令我难忘。那是一个枯燥的夏日,我因练习技巧而摔卡戴珊家族的唯一超模皮带裙搭配紧身衣,时尚品牌收割机与二姐卡戴珊相比,肯豆詹娜没有被人津津乐道的丰满身材,作为超模,台步也一直被人诟病,但这绝不影响她的平面表现力以及她逆天的带货能力。一直以来都是高奢品牌的宠儿,拍封面,各类时尚品牌秋冬的时髦优雅,少不了治愈系比起冬季常见的黑白灰,暖色调色彩清爽的浅色这类清淡素雅的色调更能够给人如沐春风的感觉,不仅和谐养眼,也更适合黄皮肤的亚洲人。白色大毛衣驼色半裙,再配一双燕麦色短靴,色调简洁却温暖有鼻整形术前准备前几篇有跟大家科普鼻整形术后的注意事项以及术前一定要了解鼻整形的风险。今天来跟大家讲讲在做鼻综合手术前,大家要做的准备工作。千万不要小看这一步,很多人只关心隆鼻后的效果但却不知道隆璐比玛斯NOBEEMAS优雅永不过时金星老师曾经说真正的美人,有着闻过书香的鼻,吟过唐诗的嘴,看过字画的眼,是不显山不露水的美。腹有诗书气自华,是一种优雅,仪态端方,亦是一种优雅。面貌经不起时光的摧残,但优雅永远不会一步到位的健康和智能体验,DidoG30S蓝牙通话健康智能手表体验就在上周,我的小米手环4最终还是没能挺过今年。习惯手环的我,总是觉得自己应该换个口味试一试。看着市面上各式各样的智能手表,我陷入了沉思。究竟什么样的智能手表才能满足我的日常需求呢?得了前列腺炎不知该怎么办?不要慌,教你6种自我疗法1停止熬夜如果患上了前列腺炎,首先要注意的就是熬夜问题。现在社会压力非常大,很多人熬夜已经成了固定的时间。但是前列腺炎患者到了晚上一定要及时休息,不可以再继续熬夜。2健康饮食可以多50岁后身体衰老,想离健康长寿近一点,早上起床少做3件事我们的身体在青春期结束之后就会开始逐渐走向衰老,随着年龄的增加,衰老的速度也会变快,同时身体各项机能的功能也会变差。特别是50岁以后,这时候也是生命的关键时期。因为这个年纪身体虚弱糖尿病人吃对早餐,血糖才好,这样吃更科学更健康糖尿病人不想吃早餐,可以吗?有的糖尿病人发现,吃完早餐血糖高,就不吃早餐了,这是非常错误的做法。不是因为吃了早餐血糖高,而是早餐吃的东西有问题,比如喝粥了或只吃了主食没有吃蔬菜和蛋乙肝患者感冒了怎么办?该如何用药?听听专家的解答如果说本来就吃治疗乙肝的药,比如说抗病毒的药,即使感冒了,这个药没有太大影响,还是要继续吃的,就是不要停药。轻微的感冒就是我们说的只是有点流鼻涕打喷嚏,既不发烧,也没有其他的问题的南华大学成功制备出新型无钴阴极材料近日,南华大学资源环境与安全科学工程学院陶泽天教授团队通过一种原位合成的方法成功制备出具有双相的新型无钴阴极材料。据了解,质子导体固体氧化物燃料电池可以高效利用氢能,是一种具有广泛安徽省级以上科技孵化器过百家科创与产业融合发展中安在线中安新闻客户端讯近年来,安徽积极对接沪苏浙创新资源,加快构建科技创新攻坚力量和成果转化运用体系,科创与产业融合发展取得积极进展。面向市场的创新能力逐步增强。安徽建成省级以上
三支ETF挑战一年资金翻倍项目式教学案例追踪第21天我是光伏大数据,点击右上方关注,为你分享光伏领域的动态趣闻和机会。今天上证指数高开上冲回落后再次拉起,最终收盘上涨0。66,冲破20105日线的压制,收出带长下影线的实体阳线,预示西部(重庆)科学城满天星再添星昨日集中签约引进的26个投资项目中,软件和信息服务重点企业占11家重庆日报客户端记者张亦筑西部科学城重庆高新区满天星行动计划暨重点招商项目集中签约现场。雷键摄2月27日,西部(重庆)科学城深入实施软件信息服务业满天星行动计划2023年工作部署会暨满怀希望且逆光而行的高级朋友圈文案有关于满怀希望且逆光而行的高级朋友圈文案短句分享给你!1我生来平平淡淡,没有显赫家世,没有倾城面貌。惊艳不了青春,斑驳不了岁月。可我依然想温暖时光,饱读诗书,努力弥补我这平淡出生,华为资本持续加码苏州芯!近日苏州培风图南半导体有限公司发生工商变更新增的一大投资方就是华为哈勃培风图南公司是国内唯一为晶圆厂提供全流程EDA软件服务的公司,位于苏州国际科技园内,其核心技术团队由拥有20年顺德兄弟卖锅火了,一年收入137亿记者丨覃毅编辑丨鄢子为一款设计清新的烤肉锅,进入中产女性的厨房。品牌名用的是英文单词,MorphyRichards。单看名字,像一款进口小家电,其实,它是广东顺德的一家公司生产销售医保谈判,不止灵魂砍价半岛全媒体记者刘雪莲3月1日,国家基本医疗保险工伤保险和生育保险药品目录(2022年)将正式实施。新版国家医保药品目录新增111个药品,谈判和竞价新准入的药品,价格平均降幅达60。乐刷被指拒退POS机押金未告知用户上调手续费率惹争议移卡子公司乐刷被用户投诉拒退POS机押金,且未提前告知用户即上调费率中国科技投资张婷龙秋月据悉,乐刷科技有限公司(以下简称乐刷)是由移卡(09923。HK)全资控股,并在全国范围内美股还有一个关键支撑在2023年震荡的市场环境中,美国股市获得了一个关键支撑公司回购股票。根据标普道琼斯指数公司(SPDowJonesIndices)的信息,预计2023年标普500指数公司的股票回购桃源街道ToFuture中外青年领导力创造营启动南都讯记者陈紫嫣通讯员姚家玥刘欣怡紧扣高校社区企业融合发展,搭建中外青年交流平台,加强国际化服务人才队伍建设,营造更具国际范的街区氛围2月26日下午,备受期待的深圳市南山区桃源街道理想又亏了!全村希望破灭,造车新势力盈利是伪命题吗?造车新势力何时能摆脱亏损迎来盈利曙光?在理想最新财报出炉后,实现这个目标的时间可能要继续往后稍稍了。财报显示,理想汽车2022财年经营亏损非GAAP经营亏损分别达到36。5亿和16阿里确定淘宝2023年五大战略晚点LatePost独家获悉,阿里的管理层们近期确定了淘宝今年的五大战略,分别是直播私域内容化本地零售和价格力。阿里的员工们在内部将它们称为五大战役。目前,这五个战略如何展开在核心