最近在搞C语言基础储备,无意间发现在此方面的知识还有漏洞,于是上网查阅资料,看到了下面的正文内容,阅后感到思路清晰心情愉悦。所以就顺手记录了下来,以后要是又忘记可以再来看。当然最主要的还是分享给大家!~
gap///
与基本类型指针变量相似,结构体指针变量主要作用是存储其结构体变量的地址或结构体数组的地址,通过间接方式操作对应的变量和数组。在C语言中规定,结构体指针变量可以参与的运算符如下: ++,--,+ ,* ,->,.,|,&,! 下面通过例题说明,如何引用结构体指针变量存储结构体变量地址,以及如何通过结构体指针变量间接的引用结构体变量以及其成员变量。 例9-3 应用结构体指针变量,打印结构体成员变量的信息。 #includestruct Point { double x;
/*x坐标*/ double y;
/*y坐标*/ double z;
/*z坐标*/ };
int main() { struct Point oPoint1={100,100,0};
struct Point oPoint2;
struct Point *pPoint;
/*定义结构体指针变量*/ pPoint=& oPoint2;
/*结构体指针变量赋值*/ (*pPoint).x= oPoint1.x;
(*pPoint).y= oPoint1.y;
(*pPoint).z= oPoint1.z;
printf("oPoint2={%7.2f,%7.2f,%7.2f}",oPoint2.x, oPoint2.y, oPoint2.z);
return(0);
} 程序运行结果如下: oPoint2={ 100.00,100.00,0.00} 其中表达式&oPoint2的作用是获得结构体变量oPoint2的地址。表达式pPoint=&oPoint2的作用是将oPoint2的地址存储在结构体指针变量pPoint中,因此pPoint存储了oPoint2的地址。*pPoint代表指针变量pPoint中的内容,因此*pPoint 和oPoint2等价。 通过结构体指针变量获得其结构体变量的成员变量的一般形式如下: (*结构体指针变量). 成员变量 其中“结构体指针变量”为结构体指针变量,“成员变量”为结构体成员变量名称,“.”为取结构体成员变量的运算符。 另外C语言中引入了新的运算符“->”,通过结构体指针变量直接获得结构体变量的成员变量,一般形式如下: 结构体指针变量-> 成员变量 其中“结构体指针变量”为结构体指针变量,“成员变量”为结构体成员变量名称,“- >”为运算符。 因此,例9-3中的部分代码 …… (*pPoint).x= oPoint1.x;
(*pPoint).y= oPoint1.y;
(*pPoint).z= oPoint1.z;
…… 等价于 …… pPoint->x= oPoint1.x;
pPoint->y= oPoint1.y;
pPoint->z= oPoint1.z;
…… 下面介绍如何应用结构体指针变量存储结构体数组的首地址,以及如何通过结构体指针变量获得结构体数组的元素及其成员变量。 例9-4 应用结构体指针变量改写例9-3,主要介绍修改部分Mutiline函数,其他部分略。 /*多边形绘制函数,形式参数为struct Point 类型指针变量pPoints */ void Mutiline(struct Point *pPoints) { int i;
struct Point *pOPoint;
/*定义结构体指针变量*/ pOPoint=pPoints;
/*存储结构体数组的首地址*/ moveto(pPoints->x,pPoints->y) ;
/*将绘图点移动到第0个点*/ for( i=0;
i
0X0F9A- 0X0F82=0X0018=24=sizeof(struct Point),24个字节正好为struct Point的大小。 此时pPoints指向数组元素oPoints[1]的地址, 因此*pPoints与oPoints[1]的等价。依次类推,通过pPoints的加法运算可以访问结构体数组oPoints中的所有元素。 因此要正确理解结构体指针变量的算术运算,pPoints++或pPoints= pPoints+1的作用不是简单的地址值加1,而是当前的地址值加上结构体类型的大小。 结构体指针变量+1= 结构体指针变量+sizeof(struct 结构体) 例9-5 输入10个同学的姓名、数学成绩、英语成绩和物理成绩,确定总分最高的同学,并打印其姓名及其三门课程的成绩。 #include "stdio.h" struct Student /*定义结构体struct Student*/ { char Name[20];
/*姓名*/ float Math;
/*数学*/ float English;
/*英语*/ float Physical;
/*物理*/ };
void main() { /*定义struct Student类型结构体数组存储所有同学的相关信息*/ struct Student oStudents[10]={{"",0,0,0}};
/*定义struct Student类型指针存储总分最高的同学的地址信息*/ struct Student *pMaxStu;
struct Student *pStudent;
float fMaxScore,fTotal;
float fMath,fEnglish,fPhysical;
char szName[20];
printf("\nPlease input 10 students and there score\n");
/*提示信息*/ printf("---------------------------- ------------\n");
printf("Name Math English Physical \n");
printf("---------------------------- ------------\n");
fMaxScore=0;
pMaxStu=oStudents;
for(pStudent=oStudents;
pStudent
推荐阅读
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- 单片机|自学单片机好找工作吗(会单片机能找什么工作?)
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- Python|教你写个简单好用的Python脚本一键自动整理文件非常适合办公用~
- C/C++|C/C++ basis 02
- 为了搭建冬奥会志愿者系统,他独自跨越大半个中国学习低代码
- 程序员|程序员“真实”日常(每天敲代码不到 1 小时)
- GitHub|7 款可替代 top 命令的工具
- 程序员|自学编程,学完新的又忘旧的,该怎么办()