指向结构体类型数据的指针_第1页
指向结构体类型数据的指针_第2页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、指向结构体类型数据的指针知识概要一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始值。指针变量也可以用来指向结构体数组中的元素。知识内容1.指向结构体变量的指针下面通过一个简单例子来说明指向结构体变量的指针变量的应用。#include #include Void main()了struct student 类型*/Struct studentlong num;char name20; char sex;float score;Struct student stu_1; Struct student * p;

2、p=&stu_1; stu_1.num=89101;strcpy(stu_1.name,”Li Lin”); stu_1.sex=M; stu_1.score=89.5;/*/*定义一 struct student 类型的变量stu_1*/*定义一个 struct student 指针p*/prf(“No.:%ldnname:%nsex:%cnscore:%fn”,stu_1.num,stu_1.name,stu_1.sex,stu_1.scoer);prf(“No.:%ldnname:%nsex:%cnscore:%fn”,(*p).num, (*p).name, (*p).sex,(*p)

3、.scoer);在函数的执行部分结构体变量stu_1 的起始地址赋给指针变量p,也就是使p 指向stu_1,然后对 stu_1 的各成员赋值。第一个prf 函数是输出stu_1 的各个成员的值。用stu_1.num 表示stu_1 中的成员 num,以此类推。第二个 prf函数也是用来输出stu_1 各个成员的值,但使用的是(*p).num 这样的方式。(*p)表示p 指向的结构体变量,(*p).num 是p 指向的结构体变量中的成员 num。注意*p 两侧的括号不可省,因为成员运算符“.”优先于“*”运算符,*p.num就等价于*(p.num)。程序的运算结果如下:No:89101Name:

4、LiLin Sex:M Score:89.500000No:89101Name:LiLin Sex:M Score:89.500000可见两个 prf 函数输出的结果是相同的。为了使用方便和使之直观,可以把(*p).num 改用pnum 来代替,它表示p 指向的结构体变量中的num 成员。同样,(*p).num 等价于pname。也就是说,以下 3 种形式等价:结构体变量.成员名(*P).成员名 P成员名上面程序中最后一个 prf 函数中的输出项表列可以改写为:pnum,pname,psex,pscore其中称为指向运算符。请分析以下几种运算符:2.指向结构体数组元素的指针例:指向结构体数组元

5、素的指针的应用#include p-n得到p 指向的结构体变量中的成员 n 的值p-n+得到p 指向的结构体变量中的成员 n 的值,用完该值后使他加 1+p-n得到p 指向的结构体变量中的成员 n 的值加 1,然后再使用它Struct studentnum;CharCharname20;sex; age;Struct studentstu3=10101,”LiLin”,M,18,10102,”ZhangFun”,M,19,10104,”WangVoidmain()Structstudent*p;Min”,F,20;Prf(“Nsexagen”);For(p=stu;pnum,p-n

6、ame,p-sex,p-age);运行结果如下:No.101011010210104nameLiLin Zhang FunsexM M Fage181920WangMinP 是指向 Struct student 结构体类型数据的指针变量。在 for 与语句中先使 p 的初值为stu,也就是数组stu 第一个元素的起始地址。红色表示:stu0注意以下两点:蓝色表示:stu1绿色表示:stu21)如果p 的初值为 stu,即指向第一个元素,则 p 加 1 后 p 就指向下一个元素。例如:(+p)num 先使p 自加 1,然后得到它指向的元素中的num 成员值(即 10102)10101LiLinM

7、1810102Zhang FunM1910104WangMinF20(p+)num 先得到pnum 的值(即 10101),然后使 p 自加 1,指向stu1请注意以上二者的不同。程序已定义了 p 是一个指向 Struct studen 类型数据的指针变量,它用来指向一个Struct studen 类型的数据的,不应用来指向 stu 数组元素中的某一成员。例如:下面的用法是不对的P=;不要认为反正 p 是存放地址的,可以将任何地址赋给它。如果要将某一成员的地址赋给 p,可以用强制类型转换,先将成员的地址转换成 p 的类型。例如:p=(Struct student *)stu0

8、.name;2)此时,p 的值是stu0元素的name 成员的起始地址。可以用“prf(%s,p);”输出 stu0中成员name 的值。但是,p 仍保持原来的类型。如果执行“prf(%s,p+1);”,则会输出 stu1中name 的值。p+1 的值是在p的值得基础上加上结构体Struct studen 的字节长度。3.用结构体变量和指向结构体的指针函数参数将一个结构体变量的值传递给另一个函数,有 3 个方法:1)用结构体变量的成员作参数。例如,用 stu1.num 或 stu2.num作函数的实参,将实参传递给形参。用法和用普通变量作实参是一的,属于“值传递”方式。应当注意实参与形参的类型

9、保持一致。2)用结构体变量作实参。用结构体变量作实参时,采取的也是“值传递”的方式。3)用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。例题:有一个结构体变量 stu,内含学生学号、和 3 门课程的成绩。要求在 main 函数中赋予值,在另一函数 pr中将它们输出。#include #include #defineFORMAT“%dn%sn%fn%fn%fn”Structstudent num;CharFloat;VoidVoid Structname20;score3;main()pr(Structstudent );studentstu;Stu.num=123

10、45;Strcpy(,”LiLi”); Stu.score0=67.5; Stu.score1=89; Stu.score2=78.6;Pr(stu);Voidpr(Structstudentstu)PrPrf (FORMAT,stu.num, , stu. score0, stu. score1, stu. score2);f(“n”);运行结果如下:12345LiLi 67.50000089.00000078.599998Structstudent 被定义为外部的类型,这样,同一源文件中的各个函数都可以用它来定义变量。main 函数中的stu 定义Struc

11、tstudent 类型变量,pr函数中的形参stu 也定义为Structstudent 类型变量。在 main 函数中对stu 的各个成员赋值。在调用pr函数时,以stu 为实参向形参stu 实行“值传递”。在pr函数中输出结构体变量stu 各成员的值。例题:将上题改用指向结构体变量的指针作实参。#include #include #defineFORMATStructstudent num;“%dn%sn%fn%fn%fn”Charname20;Floatscore3;stu=12345, ”LiVoidmain()Li”, 67.5,89,78.6;(Structstudent*);/*形

12、参类型修改成指向结构体的指针变量*/*实参改为 stu 的起始地址*/VoidprPr(&stu);(Structstudent*p)/*形参类型修改了*/VoidprPrf (FORMAT,p-num, p-name, p- score0, p- score1, p- score2);/*用指针变量调用各成员的值*/Prf(“n”);注意在调用 pr函数时,用结构体变量stu 的起始地址&stu 作实参。在调用函数时将该地址传送给形参 p(p 是指针变量)。在 pr的结构体变量的各个成员值,它们也就是stu 的成员值。函数中输出 p 所指向main 函数中的对各成员赋值也可以改用scanf 函数输入,即用:scanf(”%d%s% &stu. score2,);输入时用下面形式输入:12345Li Li67.58978.6注意:输入项表列中 前没有“&”符号,因为 ”,&st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论