小甲鱼结构体与共用体03

实战例题:有一个结构体变量stu,内含学生学号、姓名和3门课程的成绩。通过调用函数print将它们输出。
①先用结构体变量作函数参数:

//先用结构体变量作函数参数
#include <stdio.h>
#include <string.h>struct student
{int num;char name[20];float score[3];
};void print(struct student);void main()
{struct student stu;stu.num = 8;strcpy(stu.name,"Fishc.com!");//stu.name = "Fishc.com!";stu.score[0] = 99.5;stu.score[1] = 97.0;stu.score[2] = 94.5;print(stu);
}void print(struct student stu)
{printf("\tnum     : %d\n",stu.num);printf("\tname    : %s\n",stu.name);printf("\tscore_1 : %5.2f\n",stu.score[0]);printf("\tscore_2 : %5.2f\n",stu.score[1]);printf("\tscore_3 : %5.2f\n",stu.score[2]);printf("\n");
}


②改用指向结构体变量的指针作实参 ,传递效率较高

//改用指向结构体变量的指针作实参 ,传递效率较高
#include <stdio.h>
#include <string.h>struct student
{int num;char name[20];float score[3];
};void print(struct student *);void main()
{struct student stu;stu.num = 8;strcpy(stu.name,"Fishc.com!");//stu.name = "Fishc.com!";stu.score[0] = 99.5;stu.score[1] = 97.0;stu.score[2] = 94.5;print(&stu);
}void print(struct student *p)
{printf("\tnum     : %d\n",p->num);printf("\tname    : %s\n",p->name);printf("\tscore_1 : %5.2f\n",p->score[0]);printf("\tscore_2 : %5.2f\n",p->score[1]);printf("\tscore_3 : %5.2f\n",p->score[2]);printf("\n");
}

运行结果与上述均一致。

动态存储分配
数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。
例如:int a[n]; 是错误的。
用变量表示长度,想对数组的大小作动态说明,这是错误的。
但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。
所以对于这种问题,用数组的办法很难解决。
为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。

常用的内存管理函数有以下三个:
1、分配内存空间函数malloc、calloc
2、释放内存空间函数free

malloc函数:
函数原型为void *malloc(unsigned int size);
其作用是在内存的动态存储区中分配一个长度为size的连续空间(size是一个无符号数)
此函数的返回值是一个指向分配域起始地址的指针(类型为void)
如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)

calloc函数:
函数原型为void *calloc(unsigned n,unsigned size);
其作用是在内存的动态存储区中分配n个长度为size的连续空间
函数返回一个指向分配域起始地址的指针
如果分配不成功,返回NULL
用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size

free函数
函数原型为void free(void *p);
其作用是释放由p指向的内存区,使这部分内存区能被其他变量使用。
p是最近一次调用calloc函数或malloc函数时返回的值
free函数无返回值

链表:
链表时一种常见的重要的数据结构,是动态地进行存储分配的一种结构。
链表的组成:
头指针:存放一个地址,该地址指向第一个元素
结点:用户需要的实际数据和链接结点的指针。

建立动态链表:指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点的数据,并建立起前后相连的关系。

例题源码:

//链表
#include <stdio.h>struct student
{long num;float score;struct student *next;
};void main()
{struct student a,b,c,*head;a.num = 10101;a.score = 89.5;b.num = 10103;b.score = 90;c.num = 10107;c.score = 85;head = &a;a.next = &b;b.next = &c;c.next = NULL;do{printf("%d %5.1f\n",head->num,head->score);head = head->next;}while(head != NULL);
}

练习:根据下面的分析写一程序建立一个含有学生(学号,成绩)数据的单向动态链表。
(约定:我们约定学号不会为零,如果输入的学号为0,则表示建立链表的过程完成,该结点不应连接到链表中)

C语言结构体与共用体03相关推荐

  1. C语言集锦 | 03 - C语言的复合数据类型(typedef关键字、结构体、枚举体、共用体)

    文档版本 更新时间 更新内容 v1.0 2020-09-14 初稿完成 文章目录 一.typedef关键词 二.结构体(重点) 1. 为什么需要结构体 2. 什么是结构体 3. 如何定义结构体 4. ...

  2. 结构体与共用体05 - 零基础入门学习C语言57

    第十章:结构体与共用体05 让编程改变世界 Change the world by program 对链表结点的删除操作实现 实现源代码: [codesyntax lang="c" ...

  3. C语言之结构体和共用体

    C语言之结构体和共用体 算上这篇笔记加上之前的四篇笔记,C语言基础我们也就告一段落了,对于刚刚接触c语言的童鞋们来说,这些以及足够了,稍后我会发布数据结构,对于想要深入学习的童鞋可以继续关注.本人也算 ...

  4. 【C语言】结构体、共用体、位域

    结构体 1. 结构体的声明方法 struct struct_name {data_type member1;data_type member2;.. }; 这是其中一种声明方式~ 2.定义一个结构体变 ...

  5. C语言入门系列之10.结构体和共用体

    文章目录 一.结构体变量的基本使用 1.概述 2.定义结构体类型变量的方法 3.结构体变量的引用 4.结构体变量的初始化 二.结构体的高级应用 1.结构体数组 Ⅰ定义结构体数组 Ⅱ结构体数组的初始化 ...

  6. C语言-结构体与共用体

    int 4字节:char 1字节:short 2字节:float 4字节: 1字节bytes=8位bits(2^8): struct date {int month;int day;int year; ...

  7. 江哥带你玩转C语言 | 14 - 结构体-枚举-共用体

    什么是结构体 结构体和数组一样属于构造类型 数组是用于保存一组相同类型数据的, 而结构体是用于保存一组不同类型数组的 例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为 ...

  8. 结构体与共用体07 - 零基础入门学习C语言59

    第十章:结构体与共用体07 让编程改变世界 Change the world by program 用typedef定义类型 用typedef声明新的类型名来代替已有的类型名   声明INTEGER为 ...

  9. 结构体与共用体C语言

    结构体与共用体 结构体的定义 引例 比如学生是一个整体,学生有姓名.性别.学号--我们更希望把一个事物整体的操作 自定义数据类型 基础数据类型是电脑定义好了的,默认的数据类型 自定义数据类型意义:需要 ...

最新文章

  1. 机器人时代的资本主义:21世纪的工作,收入和财富
  2. Ubuntu Server下配置UTF-8中文/英文环境
  3. Oracle 中重新编译无效的存储过程, 或函数、触发器等对象(转)
  4. 中英文标点符号切换的组合键_易混标点符号:一字线(—)、短横线(-)、浪纹线(~)...
  5. fopen、fwrite使用
  6. java optional用法_2019年 Java 调查报告:“被取代”是不存在的!
  7. openfire User Service 和删除分组的方法
  8. WinForm中TextBox的几个基本技巧
  9. mysql忘记root密码怎么办,几个简单操作步骤找回mysql密码
  10. python在材料方面的应用_Python数据科学(一)- python与数据科学应用(Ⅰ)
  11. scp登录The authenticity of host 192.168.0.xxx can't be established. 的问题
  12. matlab 添加子图图案,matplotlib给子图添加图例的方法
  13. 让站长崩溃的骚操作,你中过招吗?
  14. java 判断是否回文
  15. 享受知识饕餮盛宴,尽在近期课程安排
  16. jop怎么读音英语怎么说_job怎么读?
  17. java中gat和sat方法_2016届高考语法专项复习单项填空(16)
  18. 数据结构和算法(第九章哈希表)
  19. 关于微信公众号二次开发(文本消息回复功能)
  20. 四川大学计算机学院研究生调剂,四川大学计算机学院2019年考研调剂信息(第二批)...

热门文章

  1. Java实现百度云OCR接口识别图片文字信息(也包含身份证,银行卡识别,更新添加通用票据识别)
  2. BeautifulSoup爬取豆瓣电影数据
  3. sql server 2008 年累计数_要点分析:用SQL+Excel监控数据库性能
  4. TransformerCPI文献阅读
  5. 数据库中存储大量图片设计
  6. Message: session not created: This version of ChromeDriver only supports Chrome version 98
  7. 1106. 解析布尔表达式 DFS
  8. 9-1拼多多题目,4题AK
  9. Atitit 教育与培训学校 的计划策划 v4 qc18
  10. sliverlight控件