第二十二章结构 22.1面向对象的启蒙 22.2结构/ struc t的定义 3.操作符 22.4->操作符 2.5结构实例 22.6结构与函数 22.6.1结构变量作为函数参数 22.6.1.1结构变量以传值的方式传递 22.6.1.2结构变量以传址的方式传递 22.6.1.3结构变量以常量传址方式传递 22.6.1.4兼容C:使用指针传递结构变量 22.6.2函数返回值是结构类型 22.7作业 大家好。课程拖了好久,大家急,我也急。今天是周末,一早去医院体检,被女医生扎了 针,胳膊上留下一个针眼。不禁想起一个真实的故事。一个我的同行(程序员),和我差不多 瘦。有一年夏天到南方出差,住在旅馆里,一个晚上没睡好!为什么?因为蚊子又太多了啊。 几夜没睡好这可真够倒霉的啦。谁知祸不单行。上了火车他困啊!卧铺上一歪他就睡着了,那 只胳膊瘦瘦的,从睡铺上垂下来,露出被蚊子们叮的密密麻麻的红点。才睡不久,就被乘警叫 醒带走一一下铺的乘客去举报了,说他是吸毒青年 兄弟们,当程序员很苦!不过苦得值。当然身体要弄好。 22.1面向对象的启蒙 我们以前学习了各种数据类型的变量。先来复习一下。 变量做什么用?程序用来变量来存储数据,用它来表达真实世界中的事物
第二十二章 结构 22.1 面向对象的启蒙 22.2 结构/struct 的定义 22.3 . 操作符 22.4 -> 操作符 22.5 结构实例 22.6 结构与函数 22.6.1 结构变量作为函数参数 22.6.1.1 结构变量以传值的方式传递 22.6.1.2 结构变量以传址的方式传递 22.6.1.3 结构变量以常量传址方式传递 22.6.1.4 兼容 C:使用指针传递结构变量 22.6.2 函数返回值是结构类型 22.7 作业 大家好。课程拖了好久,大家急,我也急。今天是周末,一早去医院体检,被女医生扎了一 针,胳膊上留下一个针眼。不禁想起一个真实的故事。一个我的同行(程序员),和我差不多 瘦。有一年夏天到南方出差,住在旅馆里,一个晚上没睡好!为什么?因为蚊子又太多了啊。 几夜没睡好这可真够倒霉的啦。谁知祸不单行。上了火车他困啊!卧铺上一歪他就睡着了,那 只胳膊瘦瘦的,从睡铺上垂下来,露出被蚊子们叮的密密麻麻的红点。才睡不久,就被乘警叫 醒带走——下铺的乘客去举报了,说他是吸毒青年。 兄弟们,当程序员很苦!不过苦得值。当然身体要弄好。 22.1 面向对象的启蒙 我们以前学习了各种数据类型的变量。先来复习一下。 变量做什么用?程序用来变量来存储数据,用它来表达真实世界中的事物
比如:假设我最近开了一家幼儿园,园里有一群小娃娃。娃娃的家长们把孩子交给我们之后, 都要求我们要时时关心孩子们的“健康成长”,因此我们不得不为每个孩子建一个入园档案 档案记载每个孩子的一些数据。 //娃娃的名字 char xingming[11]://姓名最长5个汉字,占用10字节,多留一个字节用于存放\0 //娃娃的身高 nt shengao;//单位cm //体重 float bizhong;//单位公斤 我们知道,世界的万事万物,去除一些无用的修饰,可以表达为“数据”和“操作”。比如: 我吃饭,“我”和“饭”是数据,而“吃”是一种动作,一种操作。对应到编程语言,就是“数 据”和“流程”。那么,当我们写程序来解决某一现实问题时,应该先考虑的“数据”,还是 流程”呢?多数问题,应该先去考虑“数据”。也就是说,当遇上一个现实问题,我们应先 去“抽取”这个问题的数据,考虑如在程序中表达,设计,定义这些数据。然后再去设计流程。 以我们上面的幼儿园管理的例子,我们现在已经差不多抓出相关的数据。不过,上面所做的 只是“一个孩子”的数据,幼儿园里的孩子当然不会只有一个。还好,我们学过数组,不是吗? 所以,我们将上面的变量定义改一改。 先定义一个宏,假设园里有30名宝宝。 # define baobao_GESH30//30个宝宝 //30个宝宝,要30个名字: char xingMing[ BAOBAO GESHU][11];//忘了二维数组?呵呵。复习一下
比如:假设我最近开了一家幼儿园,园里有一群小娃娃。娃娃的家长们把孩子交给我们之后, 都要求我们要时时关心孩子们的“健康成长”,因此我们不得不为每个孩子建一个入园档案。 档案记载每个孩子的一些数据。 //娃娃的名字: char xingMing[11]; //姓名最长 5 个汉字,占用 10 字节,多留一个字节用于存放'\0' //娃娃的身高: int shenGao; //单位 cm //体重: float tiZhong; //单位 公斤 我们知道,世界的万事万物,去除一些无用的修饰,可以表达为“数据”和“操作”。比如: 我吃饭,“我”和“饭”是数据,而“吃”是一种动作,一种操作。对应到编程语言,就是“数 据”和“流程”。那么,当我们写程序来解决某一现实问题时,应该先考虑的“数据”,还是 “流程”呢?多数问题,应该先去考虑“数据”。也就是说,当遇上一个现实问题,我们应先 去“抽取”这个问题的数据,考虑如在程序中表达,设计,定义这些数据。然后再去设计流程。 以我们上面的幼儿园管理的例子,我们现在已经差不多抓出相关的数据。不过,上面所做的, 只是“一个孩子”的数据,幼儿园里的孩子当然不会只有一个。还好,我们学过数组,不是吗? 所以,我们将上面的变量定义改一改。 先定义一个宏,假设园里有 30 名宝宝。 #define BAOBAO_GESHU 30 //30 个宝宝 //30 个宝宝,要 30 个名字: char xingMing[BAOBAO_GESHU][11]; //忘了二维数组?呵呵。复习一下
//30个宝宝,30个身高 int shenGao [BAOBAO GESHU //30个宝宝,30个体重: float tiZhong [BAOBAO GESHU 假设我们的程序具备打印功能。这样每一天放学时,我们都在宝宝走出校门前,将他或她称 量一番,得出体重,身高。记录到我们的程序,然后程序再打印出一张小纸条。贴在宝宝后脑 勺,供宝宝妈妈参考……哈哈,我们可以把这个小程序卖给本市的300家幼儿园,每份卖400 元,300家就是400*300=120000元……流口水中 擦干口水回过神,来开始我们的今天最重要的学习:面向对象的启蒙 什么叫面向对象,我且不解释。不结合实例子,解释也没有用啊。 个人,有眼睛、鼻子、嘴、头发、四肢。也就是说,“人”是一种“数据”,而“鼻子” “嘴”,“头发”等也各自是一种数据,彼此之间具备不同的“数据类型”。但是在多数情况 下,“人”是一种不可再分的整体(医院里负责解剖的人所做的事不在我们所说的多数情况之 内)。扯到编程上而来,当我们想用程序管理30个人时,我们应该是定义一个数组,存储30 个人,而不是分开来定义成:30个眼睛[2]、30个鼻子、30个头发[10001,30个四肢 回到幼儿园程序。每个宝宝都有身高、体重、姓名这些属性:宝宝也应作为一个整体,而不 是像上面那样分开来定义。 这就是面向对象的第一个启蒙:面向对象,是为了让我们把程序写得更“自然而然”。越是 支持面向对象的编程语言,我们就越能以接近人类自然逻辑的思路来设计程序:而越不支持面 向对象的编程语言,也许它初看起来似乎很浅显易用,但当用它来解决实际问题时,程序员就 不得不受限于这门语言特有的解决问题的思路
//30 个宝宝,30 个身高: int shenGao[BAOBAO_GESHU]; //30 个宝宝,30 个体重: float tiZhong[BAOBAO_GESHU]; 假设我们的程序具备打印功能。这样每一天放学时,我们都在宝宝走出校门前,将他或她称 量一番,得出体重,身高。记录到我们的程序,然后程序再打印出一张小纸条。贴在宝宝后脑 勺,供宝宝妈妈参考……哈哈,我们可以把这个小程序卖给本市的 300 家幼儿园,每份卖 400 元,300 家就是 400 * 300 = 120000 元……流口水中…… 擦干口水回过神,来开始我们的今天最重要的学习:面向对象的启蒙。 什么叫面向对象,我且不解释。不结合实例子,解释也没有用啊。 一个人,有眼睛、鼻子、嘴、头发、四肢。也就是说,“人”是一种“数据”,而“鼻子”, “嘴”,“头发”等也各自是一种数据,彼此之间具备不同的“数据类型”。但是在多数情况 下,“人”是一种不可再分的整体(医院里负责解剖的人所做的事不在我们所说的多数情况之 内)。扯到编程上而来 ,当我们想用程序管理 30 个人时,我们应该是定义一个数组,存储 30 个人,而不是分开来定义成:30 个眼睛[2]、30 个鼻子、30 个头发[1000],30 个四肢。 回到幼儿园程序。每个宝宝都有身高、体重、姓名这些属性;宝宝也应作为一个整体,而不 是像上面那样分开来定义。 这就是面向对象的第一个启蒙: 面向对象,是为了让我们把程序写得更“自然而然”。越是 支持面向对象的编程语言,我们就越能以接近人类自然逻辑的思路来设计程序;而越不支持面 向对象的编程语言,也许它初看起来似乎很浅显易用,但当用它来解决实际问题时,程序员就 不得不受限于这门语言特有的解决问题的思路
说完面向对象的好处,我们必须马上来做几个问题的“纠偏”。 第一、面向对象并不代表解决问题的最高效率 确实地这样的。“面向对象”被提出,是因为某些问题实在太庞大太复杂了,人类的写程序 解决这些问题时,一会儿就胡涂了,晕了,搞错了,于是希望有一种方法来让程序员不会那么 快在一堆代码前精神崩溃。这才提出了“面向对象”。所以在我们第一次接触到这个概念时 请先记住,和我们前面所讲的一样,比哪为什么要有变量,为什么要有数据类型:编程语言设 计的不断改进,都是为了迁就人类的“容易犯错”或“天生懒惰”。否则,如果只是要追求最 高效率,如果人类有着机器般的脑,编程语言根本不需要有C,C++,JAVA,C#什么的,甚至连 汇编也不需要,只需要一个机器语言就可以。“面向对象”的编程思想迁就我们什么呢?它迁 就人类总是喜欢以比较自然的方式来解决问题。 先来考虑,“自然而然”的事,不一定是最高效率。这很多,比如,路口的红绿灯制度,显 然不是最高效率。最高效率其实应该是闯红灯。你会说,闯红灯会出车祸,出车祸不就堵车? 造成效率低了?哦,其实我是要说:如果每个司机,行人都闯红灯,并且能保证不撞到其它车 或行人,那么路口上车辆穿行的效率肯定最高。可惜,驾驶员做不到这一点,所以只好有红绿 第二、虽然说面向对象是“很自然的事”,但我们仍然要花力去学习。 古人老子说:“道法自然”。那什么叫“自然”啊? 这里的自然也是有规定的,并不是人类的所有行为都称为“自然”的,也不一定是你习惯的 行为就自然,你不习惯的行为就不自然。比如人家都觉得“饭前便后要洗手”,可若你偏要认 为这种行为太不自然,太做作,那我们也没有办法。 另外,人类解决现实生活中,有时也要追求点效率。比如,酒家承办婚礼,要准备10桌 样的酒席。每一桌上面都有这道菜那道汤的。我们可以把完整的一桌酒菜看成一个“整体 但大厨们可不这样认为,我猜他们在准备时,一定是先把某道菜一块儿做好10桌的份量,然后
说完面向对象的好处,我们必须马上来做几个问题的“纠偏”。 第一、面向对象并不代表解决问题的最高效率。 确实地这样的。“面向对象”被提出,是因为某些问题实在太庞大太复杂了,人类的写程序 解决这些问题时,一会儿就胡涂了,晕了,搞错了,于是希望有一种方法来让程序员不会那么 快在一堆代码前精神崩溃。这才提出了“面向对象”。所以在我们第一次接触到这个概念时, 请先记住,和我们前面所讲的一样,比哪为什么要有变量,为什么要有数据类型:编程语言设 计的不断改进,都是为了迁就人类的“容易犯错”或“天生懒惰”。否则,如果只是要追求最 高效率,如果人类有着机器般的脑,编程语言根本不需要有 C,C++,JAVA,C#什么的,甚至连 汇编也不需要,只需要一个机器语言就可以。“面向对象”的编程思想迁就我们什么呢?它迁 就人类总是喜欢以比较自然的方式来解决问题。 先来考虑,“自然而然”的事,不一定是最高效率。这很多,比如,路口的红绿灯制度,显 然不是最高效率。最高效率其实应该是闯红灯。你会说,闯红灯会出车祸,出车祸不就堵车? 造成效率低了?哦,其实我是要说:如果每个司机,行人都闯红灯,并且能保证不撞到其它车 或行人,那么路口上车辆穿行的效率肯定最高。可惜,驾驶员做不到这一点,所以只好有红绿 灯。 第二、虽然说面向对象是“很自然的事”,但我们仍然要花力去学习。 古人老子说:“道法自然”。那什么叫“自然”啊? 这里的自然也是有规定的,并不是人类的所有行为都称为“自然”的,也不一定是你习惯的 行为就自然,你不习惯的行为就不自然。比如人家都觉得“饭前便后要洗手”,可若你偏要认 为这种行为太不自然,太做作,那我们也没有办法。 另外,人类解决现实生活中,有时也要追求点效率。比如,酒家承办婚礼,要准备 10 桌一 样的酒席。每一桌上面都有这道菜那道汤的。我们可以把完整的一桌酒菜看成一个“整体”。 但大厨们可不这样认为,我猜他们在准备时,一定是先把某道菜一块儿做好 10 桌的份量,然后
做下一道菜,而不是我们认为的,先办好一桌,再办下一桌。对于我们,一桌一桌菜是自然的, 而对做的人来说,一道一道菜才是自然的。 如何设计一个面向对象的程序,并且保证一定的高效率,这是一门无止境的科学,我们需要 不断地学习。面象对象源于生活,而高于生活 说了这么多,大家不要被“面向对象”吓坏了。今天我们所要学习的面向对象的设计方法, 很简单:把同属于一个整体的“数据”,归成一个新的类型去考虑,而不是分割成每一部分。 22.2结构/ struct的定义 结构”提供一种能力,允许程序员把多个数据类型,归属成一个完整的,新的数据类型 以上面的幼儿园管理程序为例,我们可以定义出这样一个新的数据类型 struct baoB char xingMing[11] int shengao float tazhong };//<一-注意,以分号结束定义 现在,我们有了一种新的数据类型,叫 Baobao结构。该数据类型由三个变量的定义组成 分别是 xingMing[10], shengao, sizhong。这三个组成变量,我们称为该结构的“成员变量” 既然 Baobao是一种数据类型,我们就可以定义一个该类型的变量 Baobao dabao;// dabao是一个“ Baobao”类型的变量
做下一道菜,而不是我们认为的,先办好一桌,再办下一桌。对于我们,一桌一桌菜是自然的, 而对做的人来说,一道一道菜才是自然的。 如何设计一个面向对象的程序,并且保证一定的高效率,这是一门无止境的科学,我们需要 不断地学习。面象对象源于生活,而高于生活。 说了这么多,大家不要被“面向对象”吓坏了。今天我们所要学习的面向对象的设计方法, 很简单:把同属于一个整体的“数据”,归成一个新的类型去考虑,而不是分割成每一部分。 22.2 结构/struct 的定义 “结构”提供一种能力,允许程序员把多个数据类型,归属成一个完整的,新的数据类型。 以上面的幼儿园管理程序为例,我们可以定义出这样一个新的数据类型: s t ruct BaoBao { char xingMing[11]; int shenGao; float tiZhong; } ; //<----注意,以分号结束定义 现在,我们有了一种新的数据类型,叫 BaoBao 结构。该数据类型由三个变量的定义组成。 分别是 xingMing[10], shenGao, tiZhong。这三个组成变量,我们称为该结构的“成员变量”。 既然 BaoBao 是一种数据类型,我们就可以定义一个该类型的变量: BaoBao daBao; //daBao 是一个“BaoBao”类型的变量