- 1、本文档共47页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章 的结构体和共同体
结构指针变量说明的一般形式为: struct 结构名 *结构指针变量名 main() { struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; struct student stu_1; struct student *p; p=stu_1; stu_1.num=101; strcpy(stu_1.name,Li Lin); stu_1.sex=M; stu_1.score=89.5; printf(%f,%f,stu_1.score,(*p).score); getch();} 注意: 1、p=stu_1 指针变量p指向一个struct student的变量stu_1的起始地址。 2、如果要用指针指向结构体的成员,可以使用(*p).num。 (*p)表示p指向的结构体变量,(*p).num表示p指向的结构体变量中的成员num。 4、为了方便直观,在C语言中可以把 (*p).num 改用 p?num 来代替。 由此可以看出: 以下三种情况是等价的: (1)结构体变量 . 成员名 (2)(*p). 成员名 (3)p?成员名 3、(*p).num的()一定不能少,这是因为成员运算符“.”优先于“*”运算符。*p.num就等价于*(p.num) 二、指向结构体数组的指针 结构体指针变量也可指向结构数组的一个元素,这时结构体指针变量的值是该结构数组元素的首地址。 则ps也指向该结构数组的0号元素,ps+1指向1号元素,ps+i则指向i号元素。 这与普通数组的情况是一致的。 设ps为指向结构体数组的指针变量 struct stu { int num; char name[20]; char sex; float score; }boy[5]={ {101,Zhou ping,M,45}, {102,Zhang ying,M,62.5}, {103,Liou fang,F,92.5}, {104,Cheng ling,F,87}, {105,Wang ming,M,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,ps-num, ps-name, ps-sex, ps-score); getch(); } 注意: ps=boy; 即指针ps指向数组的第一个元素的起始地址,则ps+1后ps就指向下一个元素的起始地址。 就本题而言,ps+1意味着ps所增加的值为多少字节? 三、用结构体变量和指向结构体的指针作为函数参数 P219 将一个结构体变量的值传递给另一个函数,有以下三种方法: 1、用结构体变量的成员作参数。例如:用stu.num或stu.name作函数是实参,将实参值传给形参。用法和用普通变量作实参是一样的,同属于“值传递”方式。 2、允许用结构变量作函数参数进行整体传送。 但是这种传送要将全部成员逐个传送,形参也必须是同类型的结构体变量 。属于“值传递”方式。 3、最好的办法就是使用指针,即用指针变量作函数参数进行传送。 这时由实参传向形参的只是地址,从而减少了时间和空间的开销。 例如:有一个结构体变量stu,内含学生学号、姓名和3门课的成绩。要求在main()中赋以值,在另一函数print中将它们打印输出。 例: 中国有句俗语叫“三天打鱼、两天晒网”,某人从90年1月1日起开始“三天打鱼、两天晒网”。问这个人在以后的某一天中是在“打鱼”,还是在“晒网”。 1、计算出从1990年1月1日到所填日期共有多少天? 2、如何区分是在打鱼、还是在晒网? 使用数组是存在的两个问题: 1、用数组存放数据时,必须事先定一固定的长度(即元素的个数),显然这样会浪费内存。 2、用数组的方法必须占用一块连续的内存区域。 §10.7 用指针处理链表 1249 Head A 1356 1249 B 1475 1356 C 1021 1475 D NULL 1021 每一个结点都应包括两个部分: 一为用户需要用的实际数据, 二为下一个结点的地址。 结构体变量用于做链表中的结点是最合适的。 例如: struct student {int num; float score; struct student *next; }; Next是指针类型的成员,它指向struct
文档评论(0)