第二十二章结构 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”类型的变量
这个过程,和我们定义一个整型变量,并无多大区别: int a 我们记得不同数据类型的变量,有着不同的大小(占用内存的大小) 比如:一个boo1或一个char类型的变量,占用一个字节,而一个int类型则占用4个字节 的内存 后来我们又学习数组,数组的大小除了和它的数据类型有关外,还有数组元素的个数有关。 比如: char xingMing[11]占用11个字节,而 int taZhong[30]占用4*30个字节 最后,前面的几章内,我们又学习了指针。指针类型固定占用4个字节。这是因为不管什么 类型的指针,都是要用来存储一个内存地址,而在32位的计算机上,内存地址的大小固定为4 字节(8*4=32位) 这一切我们可以用 sizeof来验证: int sl = sizeof(char) int s2= sizeof (int) nt s3= sizeof(char * int arr[10] int s4= sizeof(arr) 上面的程序执行后,s1到s4分别为:1,4,4,40 现在我们来问,我们自定义的 Baobao数据类型,它的大小是多少?换句话,也可以问:做 出如下定义之后: Baobao dabao
这个过程,和我们定义一个整型变量,并无多大区别: int a; 我们记得不同数据类型的变量,有着不同的大小(占用内存的大小)。 比如:一个 bool 或一个 char 类型的变量,占用一个字节,而一个 int 类型则占用 4 个字节 的内存; 后来我们又学习数组,数组的大小除了和它的数据类型有关外,还有数组元素的个数有关。 比如:char xingMing[11]占用 11 个字节,而 int txZhong[30]占用 4 * 30 个字节 最后,前面的几章内,我们又学习了指针。指针类型固定占用 4 个字节。这是因为不管什么 类型的指针,都是要用来存储一个内存地址,而在 32 位的计算机上,内存地址的大小固定为 4 字节(8 * 4 = 32 位)。 这一切我们可以用 sizeof 来验证: int s1 = sizeof(char); int s2 = sizeof(int); int s3 = sizeof(char *); int arr[10]; int s4 = sizeof(arr); 上面的程序执行后,s1 到 s4 分别为:1,4,4,40。 现在我们来问,我们自定义的 BaoBao 数据类型,它的大小是多少?换句话,也可以问:做 出如下定义之后: BaoBao daBao;
dabao这个变量“吃”掉了多少字节的内存呢? 我们再看一次 Baobao这个结构的定义 struct baobao char xingMing[11] int shengao float lizhong 直观上猜测, Baobao这个结构由三个成员变量组成,那么它的大小应该就是这三个成员变 量大小之和。这个猜测颇有道理,如果它是正确的话,那么, sizeof( Baobao)应等于11+4+ 让我们打开CB6,然后新建一个控制工程。然后在 Unit1.cpp里增加一些代码,使之看来 如下(黑体部分为需要增加的代码) //-- #pragma hdrs top #include //-- char xingMing[11] int shenGao float tizhong
daBao 这个变量“吃”掉了多少字节的内存呢? 我们再看一次 BaoBao 这个结构的定义: s t ruct BaoBao { char xingMing[11]; int shenGao; float tiZhong; } ; 直观上猜测,BaoBao 这个结构由三个成员变量组成,那么它的大小应该就是这三个成员变 量大小之和。这个猜测颇有道理,如果它是正确的话,那么,sizeof(BaoBao) 应等于 11 + 4 + 4 = 19; 让我们打开 CB6,然后新建一个控制工程。然后在 Unit1.cpp 里增加一些代码,使之看来 如下(黑体部分为需要增加的代码): //--------------------------------------------------------------------------- #pragma hdrstop # i nclude //--------------------------------------------------------------------------- s t ruct B aoBao { c h ar x ingMing[11]; i n t s henGao; f l oat t iZhong;
int size= sizeof (BaoBao) cout < Sizeof struct baobao=<< size < endl return 0: 按F9后看到运行结果 E:\d2school\ bcyl\ bhcpp'\newls-O 请按任意键继续. 奇怪, Baobao结构的大小,竟然是20。比我们猜测的19,多出了一个字节? 事情是这样的。就像我们去小店买东西,假设有一天我们要去赶飞机,走之前去小店买了点 食品,总价19元,店老板没有1元钱,于是我们为了能快点出发,就直接给他20元,告诉他 不用找零钱了。 为了效率,编译器也会有类似的动作。这称为结构的“字节对齐”,当然,这个对齐方法要 比我们的19取整到20复杂一点。关于编译器是通过什么规则来把一个结构进行扩展,我们留
} ; #pragma argsused int main(int argc, char* argv[]) { i n t s ize = s i zeof(BaoBao); c o ut < < " SizeOf s truct B aoBao = " < < s ize < < e ndl; s y stem("PAUSE"); return 0; } //--------------------------------------------------------------------------- 按 F9 后看到运行结果: (sizeof BaoBao) 奇怪,BaoBao 结构的大小,竟然是 20。比我们猜测的 19,多出了一个字节? 事情是这样的。就像我们去小店买东西,假设有一天我们要去赶飞机,走之前去小店买了点 食品,总价 19 元,店老板没有 1 元钱,于是我们为了能快点出发,就直接给他 20 元,告诉他 不用找零钱了。 为了效率,编译器也会有类似的动作。这称为结构的“字节对齐”,当然,这个对齐方法要 比我们的 19 取整到 20 复杂一点。关于编译器是通过什么规则来把一个结构进行扩展,我们留
在本章的增补课程中。这里只需记住,对于一个结构的大小,一定要用 sizeof才能得到它的实 际大小。当然,可以肯定的是,结构的大小一定是大于或等于其所有成员变量的大小之和 现在我们知道,定义了一个 Baobao的变量( dabao),就会在吃掉20个字节的内存。接下 来我们来看,如何使用 dabao这个变量呢? 22.3.操作符 通过点操作符,我们可以得以一个结构中的成员变量。 请看例子: Baobao dabao;//定义一个 Baobao类型的变量,变量名为 dabao; dabao. shengao=83;//“大宝”的身高是83公分 dabao. tazhong=14;/体重是14公斤 //字符串用 strcpy函数来设置 strcpy( dabao.xin刚ing,"大宝") 操作符,可以理解为“的”。不是吗? dabao. shengao,就读成“大宝的身高”,多么 的“自然而然”啊!今天我们已经摸到“面向对象”编程世界的门环了。 22.4->操作符 结构变量也可以是一个指针 Baobao* dAbAo;//定义一个指向“ Baobao”结构的指针
在本章的增补课程中。这里只需记住,对于一个结构的大小,一定要用 sizeof 才能得到它的实 际大小。当然,可以肯定的是,结构的大小一定是大于或等于其所有成员变量的大小之和。 现在我们知道,定义了一个 BaoBao 的变量(daBao),就会在吃掉 20 个字节的内存。接下 来我们来看,如何使用 daBao 这个变量呢? 22.3 . 操作符 通过点操作符,我们可以得以一个结构中的成员变量。 请看例子: BaoBao daBao; //定义一个 BaoBao 类型的变量,变量名为 daBao; daBao.shenGao = 83; //“大宝”的身高是 83 公分 daBao.tiZhong = 14; //体重是 14 公斤 //字符串用 strcpy 函数来设置 strcpy(daBao.xingMing, "大宝"); .操作符,可以理解为“的”。不是吗? daBao.shenGao ,就读成 “大宝的身高”,多么 的“自然而然”啊!今天我们已经摸到“面向对象”编程世界的门环了。 22.4 -> 操作符 结构变量也可以是一个指针: BaoBao* pDaBao; //定义一个 指向“BaoBao”结构的指针
考一下, dAbAo占用几个字节的内存,如果你回答是:20,那真该自己绝食一顿。:( 指针的大小总是只有4个字节。指向“结构”的指针也如此。我们可以通过new操作符来 为一个指针分配实际内存 pDaBao new Baobao 这一点,和我们定义一个int型指针,然后为它分配内存的操作一致: nt* pInt pInt分配后,指向一块大小为 sizeof(int)的内存,而 dAbAo分配后,指向一个大小为 sizeof( Baobao),的内存 对于指向结构的指针变量,要取得相应结构内的成员变量,必须通过以下语法 (*pDaBao) xingMing: (=*pDaBao). shenGao 从语法上分析,你必须先复习一下《指针》章节中,关于*的用法与意义。* DAbAo得到指 针实际向的结构变量,然后再进行点操作符,得到该结构变量内的某一成员。 不过上面的写法显然很繁琐。简化方法是使用->(可读作箭头操作符,或指向操作符,或 者就叫“减大于”吧) pDaBao->xing Ming pDaBao->shenGao
考一下,pDaBao 占用几个字节的内存,如果你回答是:20,那真该自己绝食一顿。:( 指针的大小总是只有 4 个字节。指向“结构”的指针也如此。我们可以通过 new 操作符来 为一个指针分配实际内存: pDaBao = new BaoBao; 这一点,和我们定义一个 int 型指针,然后为它分配内存的操作一致: int* pInt = new int; pInt 分配后,指向一块大小为 sizeof(int)的内存,而 pDaBao 分配后,指向一个大小为 sizeof(BaoBao),的内存。 对于指向结构的指针变量,要取得相应结构内的成员变量,必须通过以下语法: (*pDaBao).xingMing; (*pDaBao).shenGao; 从语法上分析,你必须先复习一下《指针》章节中,关于*的用法与意义。*pDaBao 得到指 针实际向的结构变量,然后再进行点操作符,得到该结构变量内的某一成员。 不过上面的写法显然很繁琐。简化方法是使用 -> (可读作箭头操作符,或指向操作符,或 者就叫“减大于”吧): pDaBao->xingMing; pDaBao->shenGao;