谭浩强c语言word版11内容摘要:

的指针 一个指针变量当用来指向一个结构变量时,称之为结构指针变量。 结构指针变量中的值是所指向的结构变量的首地址。 通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相同的。 结构指针变量说明的一般形式为 : struct 结构名 *结构指针变量名 例如,在前面的例题中定义了 stu这个结构,如要说明一个指向 stu的指针变量 pstu,可写为: struct stu *pstu。 当然也可在定义 stu结构时同时说明 pstu。 与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。 赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。 如果 boy是被说明为 stu类型的结构变量,则: pstu=amp。 boy 是正确的,而: pstu=amp。 stu 是错误的。 结构名 和结构变量是两个不同的概念,不能混淆。 结构名只能表示一个结构形式,编译系统并不对它分配内存空间。 只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。 因此上面 amp。 stu这种写法是错误的,不可能去取一个结构名的首地址。 有了结构指针变量,就能更方便地访问结构变量的各个成员。 其访问的一般形式为: (*结构指针变量 ).成员名 或为: 结构指针变量 成员名 例如: (*pstu).num 或者: pstunum 应该注意 (*pstu)两侧的括号不可少,因为成员符 “.”的优 先级高于 “*”。 如去掉括号写作 * *(),这样,意义就完全不对了。 下面通过例子来说明结构指针变量的具体说明和使用方法。 【例 】 struct stu { int num。 char *name。 char sex。 float score。 } boy1={102,Zhang ping,39。 M39。 ,},*pstu。 main() { pstu=amp。 boy1。 printf(Number=%d\nName=%s\n,)。 printf(Sex=%c\nScore=%f\n\n,)。 printf(Number=%d\nName=%s\n,(*pstu).num,(*pstu).name)。 printf(Sex=%c\nScore=%f\n\n,(*pstu).sex,(*pstu).score)。 printf(Number=%d\nName=%s\n,pstunum,pstuname)。 printf(Sex=%c\nScore=%f\n\n,pstusex,pstuscore)。 } 本例程序定义了一个结构 stu,定义了 stu类型结构变量 boy1并作了初始化赋值,还定义了一个指向 stu类型结构的指针变量 pstu。 在 main函数中, pstu被赋予 boy1的地址,因此 pstu 指向 boy1。 然后在 printf语句内用三种形式输出 boy1的各个成员值。 从运行结果可以看出: 结构变量 .成员名 (*结构指针变量 ).成员名 结构指针变量 成员名 这三种用于表示结构成员的形式是完全等效的。 指向结构数组的指针 指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。 结构指针变 量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。 设 ps为指向结构数组的指针变量,则 ps也指向该结构数组的 0号元素, ps+1指向 1号元素, ps+i则指向 i号元素。 这与普通数组的情况是一致的。 【例 】用指针变量输出结构数组。 struct stu { int num。 char *name。 char sex。 float score。 }boy[5]={ {101,Zhou ping,39。 M39。 ,45}, {102,Zhang ping,39。 M39。 ,}, {103,Liou fang,39。 F39。 ,}, {104,Cheng ling,39。 F39。 ,87}, {105,Wang ming,39。 M39。 ,58}, }。 main() { struct stu *ps。 printf(No\tName\t\t\tSex\tScore\t\n)。 for(ps=boy。 psboy+5。 ps++) printf(%d\t%s\t\t%c\t%f\t\n,psnum,psname,pssex,psscore)。 } 在程序中,定义了 stu结构类型的外部数组 boy并作了初始化赋值。 在 main函数内定义ps为指向 stu类型的指针。 在循环语句 for的表达式 1中, ps被赋予 boy的首地址,然后循环 5次,输出 boy数组中各成员值。 应该注意的是,一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。 也就是说不允许取一个成员的地址来赋予它。 因此,下面的赋值是错误的。 ps=amp。 boy[1].sex。 而只能是: ps=boy。 (赋予数组首地址 ) 或者是: ps=amp。 boy[0]。 (赋予 0号元 素首地址 ) 结构指针变量作函数参数 在 ANSI C标准中允许用结构变量作函数参数进行整体传送。 但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。 因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。 这时由实参传向形参的只是地址,从而减少了时间和空间的开销。 【例 】计算一组学生的平均成绩和不及格人数。 用结构指针变量作函数参数编程。 struct stu { int num。 char *name。 char sex。 float score。 }boy[5]={ {101,Li ping,39。 M39。 ,45}, {102,Zhang ping,39。 M39。 ,}, {103,He fang,39。 F39。 ,}, {104,Cheng ling,39。 F39。 ,87}, {105,Wang ming,39。 M39。 ,58}, }。 main() { struct stu *ps。 void ave(struct stu *ps)。 ps=boy。 ave(ps)。 } void ave(struct stu *ps) { int c=0,i。 float ave,s=0。 for(i=0。 i5。 i++,ps++) { s+=psscore。 if(psscore60) c+=1。 } printf(s=%f\n,s)。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。