第8章 第二讲 结构体指针、结构体做函数参数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可以定义结构体变量和指向结构体变量的指针: struct booktp book5,*p;
第8章 用户自定义数据类型 ——指针与结构
以上定义了p为指向结构体变量的指针变量。若p=&book5;,则称 指针变量p指向结构体变量book5,此时可用下述三种方式之一存取结构 体成员(三种方式是等价的): 1.结构体变量名.成员名 2.指针变量名 -> 成员名 3.(*指针变量名).成员名 其中 “ -> ” 是 指向运算符. 如有下面程序段: struct booktp *p,book5={“C++Buider网络开发实例”,”清汉计算机工作室”, 53,{2000,9}}; p=&book5; 则book5.price 、p->price 以及 (*p).price 的值都是 53.0, 而book5.pubday.year 、p->pubday.year以及(*p).pubday.year 的值都是2000。 注意此处(*p), price的圆括号不能少.指针运算符“*”作用于指针变量p上,构 成 表达式(*p),等价于结构体变量名book5。
3 张 东 92.5 平均成绩:79.2
源自文库
p p+1 p+2 3000 3098 3196
图8.20
98个字 节 98个字 节 98个字 节
book[0] book[1] book[2]
第8章 用户自定义数据类型 ——指针与结构
使用指针变量指向结构体变量或结构体数组时,应注意运算符的优先级: 1.“( )”、”[ ]”、“->”、“.”四个运算符优先级相同,在C语言中 具有 最高的优先级,运算的结合方向是“从左到右”; 2.“*”、“十十”、“一一”、“&”四个运算符优先级相同,在C语 言优先 级的级别仅次于上述的四个运算符,运算的结合方向是“从右到左”。 [例8.16]通过一个简单的例子说明指向结构体数组的指针的应用。在 main( ) 程序中,为了说明运算符的优先级和结合方向的用法,改变了书的价格。 { struct datetp
运行程序
第8章 结构体作为函数参数
main() [例8.15] #include<stdio.h> { struct st struct st bl; { 运行结果: int a; b1.a=3; 被调函数中成员的值是:8,A char b; b1.b=’c’; } ; 主调函数中成员的值是:3,c fun(b1); fun(struct st bc) { printf(”主调函数中成员 bc.a+=5; 的值是:%d,%c\n”, bc.b=’A’; printf(”被调函数中成员的值是: b1.a,b1.b); %d ,%c\n”,bc.a,bc.b); } }
运行结果:
b1.b=’c’;
8,A
8,A
fun(&b1);
printf(”%d,%c\n”,b1.a,b1.b); }
[例8.17] #define N 3 struct st { int num; char name[7]; float score; }; main( ) { int i ; float avg, inpu_avg(struct st * ); struct st student[N]; avg=inpu_avg(student);/*结构数组名作为函数的实参*/ printf(”学号 姓名 成绩\n”); for(i=0;i<N;i++) printf(“%4d%7s%6.1f\n”,student[i].num, student[i].name,student[i].score); printf(”平均成绩:%4.1f\n”,avg); }
{ unsigned year; unsigned month; }; /*出版日期*/
第8章 用户自定义数据类型 ——指针与结构
struct booktp { char name[60]; /*书名*/ char author[30]; /*作者*/ float price; /*价格*/ struct datetp pubday; }; struct booktp *p,book[3]= {{“C++Buider网络开发实例”,”清汉计算机工作室”,53.0,{2000,9}}, {“SQLServer循序渐进教程”,”Petkovic”,35.0,{1999,6}}, {“VB开发指南”,”DianneSiebold”,28.0,{2000,9}} }; p=book; printf(”%8.2f,”,++p->price);/*橙色表达式等价于++(p->price) */
运行结果: 54.00, 35.00, 35.00, 28.00 C++-Buider网络开发实例舴者:清汉计算机工作室,出版日期:2000年9月,价格:54.0 SQLServer循序渐进教程,作者:Petkovic,出版日期:1999年6月,价格:35.0 VB开发指南,作者:DianneSiebold,出版日期:2000年9月,价格:29.0
第8章 用户自定义数据类型 ——指针与结构
如下面定义一个结构体类型booktp来存储书的基本信息: struct booktp { char name[60] ; char author[30]; float price; struct datetp { unsigned year; unsigned month; }pubday; };
第8章 用户自定义数据类型 ——指针与结构
printf(”%8.2f,”,(++p)->price); /*先计算++p,p指向book[l] */ printf(”%8.2f,”,p++ ->price); /*上述表达式等价于(p++)->price */ printf(“%8. 2f\n”,p -> price++); /*上述表达式等价于(p->price)++ */ for(p=book;p<book+3;p++) /*输出结构体数组的所有数据*/ printf(“%s,作者:%s,出版日期:%d年%d月,价格:%5.1f\n”, p->name, (*p).author, p->pubday.year,p->pubday.month,p->price); }
第8章 用户自定义数据类型 ——指针与结构
8.5.1 指向结构体变量的指针变量 在定义一个结构体变量时,系统将在内存中分配一块连续的存储空 间,用于存放结构体成员的数据,这块连续存储空间的首地址称为结 构体变量的指针(也称为结构体变量的首地址)。可以定义指向结构体 变量的指针变量,若把某结构体变量的首地址赋值给一个指针变量, 则称这一指针变量指向该结构体变量。指向结构体的指针变量定义格式 是: struct 类型名 * 指针变量名;
float inpu_avg(struct st *p) { int i; float temp,avg=0.0; for(i=0;i<N;i++) { scanf(“%d%s%f”,&(p+i)->num,(p+i)->name,&temp); (p+i)-> score=temp; avg+=(p+i)- > score; 运行结果: 1 王 军 78.0 } 2 吴晓兰 67.0 3 张 东 92.5 /*以上是键盘输入*/ avg=avg/N; 学号 姓名 成绩 return avg; 1 王 军 78.0 } 2 吴晓兰 67.0
[例8.16] #include<stdio.h> struct st { int a; char b; };
fun(struct st *bp) { bp->a+=5; bp->b=’A’; printf(”%d,%c\n”,bp->a,bp->b); } main() { struct st b1; b1.a=3;
第8章 用户自定义数据类型 ——指针与结构
8.5.2 指向结构体数组的指针变量 指向结构体的指针变量也可以指向结构体数组及其元素。 例如,下述程序段: struct booktp *p,book[3]; p=book; 如图8.20所示,图中假定book[0]的地址是3000,指针变量p指向结构体数 组book的首地址,由于sizeof(struct booktp)的值为 98,每个结构体元素 占内存空间98个字节,因此p+l指向地址3098处,p+2指向地址3196处。
第8章 用户自定义数据类型 ——指针与结构
以上定义了p为指向结构体变量的指针变量。若p=&book5;,则称 指针变量p指向结构体变量book5,此时可用下述三种方式之一存取结构 体成员(三种方式是等价的): 1.结构体变量名.成员名 2.指针变量名 -> 成员名 3.(*指针变量名).成员名 其中 “ -> ” 是 指向运算符. 如有下面程序段: struct booktp *p,book5={“C++Buider网络开发实例”,”清汉计算机工作室”, 53,{2000,9}}; p=&book5; 则book5.price 、p->price 以及 (*p).price 的值都是 53.0, 而book5.pubday.year 、p->pubday.year以及(*p).pubday.year 的值都是2000。 注意此处(*p), price的圆括号不能少.指针运算符“*”作用于指针变量p上,构 成 表达式(*p),等价于结构体变量名book5。
3 张 东 92.5 平均成绩:79.2
源自文库
p p+1 p+2 3000 3098 3196
图8.20
98个字 节 98个字 节 98个字 节
book[0] book[1] book[2]
第8章 用户自定义数据类型 ——指针与结构
使用指针变量指向结构体变量或结构体数组时,应注意运算符的优先级: 1.“( )”、”[ ]”、“->”、“.”四个运算符优先级相同,在C语言中 具有 最高的优先级,运算的结合方向是“从左到右”; 2.“*”、“十十”、“一一”、“&”四个运算符优先级相同,在C语 言优先 级的级别仅次于上述的四个运算符,运算的结合方向是“从右到左”。 [例8.16]通过一个简单的例子说明指向结构体数组的指针的应用。在 main( ) 程序中,为了说明运算符的优先级和结合方向的用法,改变了书的价格。 { struct datetp
运行程序
第8章 结构体作为函数参数
main() [例8.15] #include<stdio.h> { struct st struct st bl; { 运行结果: int a; b1.a=3; 被调函数中成员的值是:8,A char b; b1.b=’c’; } ; 主调函数中成员的值是:3,c fun(b1); fun(struct st bc) { printf(”主调函数中成员 bc.a+=5; 的值是:%d,%c\n”, bc.b=’A’; printf(”被调函数中成员的值是: b1.a,b1.b); %d ,%c\n”,bc.a,bc.b); } }
运行结果:
b1.b=’c’;
8,A
8,A
fun(&b1);
printf(”%d,%c\n”,b1.a,b1.b); }
[例8.17] #define N 3 struct st { int num; char name[7]; float score; }; main( ) { int i ; float avg, inpu_avg(struct st * ); struct st student[N]; avg=inpu_avg(student);/*结构数组名作为函数的实参*/ printf(”学号 姓名 成绩\n”); for(i=0;i<N;i++) printf(“%4d%7s%6.1f\n”,student[i].num, student[i].name,student[i].score); printf(”平均成绩:%4.1f\n”,avg); }
{ unsigned year; unsigned month; }; /*出版日期*/
第8章 用户自定义数据类型 ——指针与结构
struct booktp { char name[60]; /*书名*/ char author[30]; /*作者*/ float price; /*价格*/ struct datetp pubday; }; struct booktp *p,book[3]= {{“C++Buider网络开发实例”,”清汉计算机工作室”,53.0,{2000,9}}, {“SQLServer循序渐进教程”,”Petkovic”,35.0,{1999,6}}, {“VB开发指南”,”DianneSiebold”,28.0,{2000,9}} }; p=book; printf(”%8.2f,”,++p->price);/*橙色表达式等价于++(p->price) */
运行结果: 54.00, 35.00, 35.00, 28.00 C++-Buider网络开发实例舴者:清汉计算机工作室,出版日期:2000年9月,价格:54.0 SQLServer循序渐进教程,作者:Petkovic,出版日期:1999年6月,价格:35.0 VB开发指南,作者:DianneSiebold,出版日期:2000年9月,价格:29.0
第8章 用户自定义数据类型 ——指针与结构
如下面定义一个结构体类型booktp来存储书的基本信息: struct booktp { char name[60] ; char author[30]; float price; struct datetp { unsigned year; unsigned month; }pubday; };
第8章 用户自定义数据类型 ——指针与结构
printf(”%8.2f,”,(++p)->price); /*先计算++p,p指向book[l] */ printf(”%8.2f,”,p++ ->price); /*上述表达式等价于(p++)->price */ printf(“%8. 2f\n”,p -> price++); /*上述表达式等价于(p->price)++ */ for(p=book;p<book+3;p++) /*输出结构体数组的所有数据*/ printf(“%s,作者:%s,出版日期:%d年%d月,价格:%5.1f\n”, p->name, (*p).author, p->pubday.year,p->pubday.month,p->price); }
第8章 用户自定义数据类型 ——指针与结构
8.5.1 指向结构体变量的指针变量 在定义一个结构体变量时,系统将在内存中分配一块连续的存储空 间,用于存放结构体成员的数据,这块连续存储空间的首地址称为结 构体变量的指针(也称为结构体变量的首地址)。可以定义指向结构体 变量的指针变量,若把某结构体变量的首地址赋值给一个指针变量, 则称这一指针变量指向该结构体变量。指向结构体的指针变量定义格式 是: struct 类型名 * 指针变量名;
float inpu_avg(struct st *p) { int i; float temp,avg=0.0; for(i=0;i<N;i++) { scanf(“%d%s%f”,&(p+i)->num,(p+i)->name,&temp); (p+i)-> score=temp; avg+=(p+i)- > score; 运行结果: 1 王 军 78.0 } 2 吴晓兰 67.0 3 张 东 92.5 /*以上是键盘输入*/ avg=avg/N; 学号 姓名 成绩 return avg; 1 王 军 78.0 } 2 吴晓兰 67.0
[例8.16] #include<stdio.h> struct st { int a; char b; };
fun(struct st *bp) { bp->a+=5; bp->b=’A’; printf(”%d,%c\n”,bp->a,bp->b); } main() { struct st b1; b1.a=3;
第8章 用户自定义数据类型 ——指针与结构
8.5.2 指向结构体数组的指针变量 指向结构体的指针变量也可以指向结构体数组及其元素。 例如,下述程序段: struct booktp *p,book[3]; p=book; 如图8.20所示,图中假定book[0]的地址是3000,指针变量p指向结构体数 组book的首地址,由于sizeof(struct booktp)的值为 98,每个结构体元素 占内存空间98个字节,因此p+l指向地址3098处,p+2指向地址3196处。