C语言程序设计——结构体和共用体(完整版)

合集下载

C语言程序设计教程CJ_07结构体类型概述_潭浩强第3版

C语言程序设计教程CJ_07结构体类型概述_潭浩强第3版

例:
27
辽宁师范大学
蔡静
用于动态存储分配的函数(续)
stdlib.h
Free 函数 Void *free( void *ptr ){ …… }


功能:将ptr指向的内存空间释放,交还给系统,无返 回值。 说明:ptr值不能是任意地址,只能是由于在程序中最 近一次调用过的malloc或calloc函数所返回的地址。 例: p=(char *)malloc(80);
17
辽宁师范大学
蔡静
11.6

11.6.1
指向结构体的指针
指向结构体变量的指针
指针变量的值为结构体变量的起始地址。 说明:


结构体变量.成员名 (*结构体指针).成员名 结构体指针->成员名 三者等价 ->优先于++。 p->num++ 即 (p->num)++ ++p->num 即 ++(p->num)
7
struct stud { long num; char name[20]; struct date { int month; int day; int year; }birth; char sex; }; struct stud s1, st[50];
辽宁师范大学 蔡静
11.2 结构体类型变量的定义和引用 1. 结构体变量的定义
数据类型概述
整型 基本 数据类型 Short int long float double
系统预定义的标准数据类型
实型(浮点型) 字符类型char Void类型
指针类型T* 结构体类型struct 位段 bit field 共用体类型union 枚举类型enum typedef 数组类型T[……] 文件类型FILE 函数类型

共用体和结构体字节对齐

共用体和结构体字节对齐

共⽤体和结构体字节对齐编译器会为结构体变量中的每个数据成员分配不同的地址空间,也就是说,结构体变量中的数据程序是并列关系,⽽编译器为共⽤体变量中的数据成员分配的是同⼀块内存,每个时刻只有⼀个数据成员有意义,从地址的⾓度来看两者的差异,形象地表明了这⼀点#include <stdio.h>#include <stdlib.h>#include <string.h>//初始化⽅式和结构体类似union data{ //类似于结构体变量,共享内存,共⽤体的⼤⼩等于最长的那⼀段,共⽤体变量在任何时刻只有⼀个成员变量存在,定义的时候不能初始化,只有在创建的时候才能初始化 int price;char brand[20];}d1, d2, *pData, data[10];union key{ //共⽤体会存在字节数填充,直到可以被最⼩类型字节数整除,double有8个字节,a数组有9个,再填充7个字节,恰好被double整除//内存对齐的⽅式,分别CPU寻址double d;char a[9];} k; //sizeof(k) =16void main(){printf("%d\n", sizeof(d1)); //20d1.price = 100;strcpy(d1.brand,"IBM");d2 =d1; //共⽤体变量可以直接赋值printf("%d,%s\n",d1.price,d1.brand); //5063241,IBM 只正确显⽰,最后⼀个赋值的变量,其他的数据解析为错误数据,因为他们共⽤⼀段内存union data uniondata = {100 }; //⼤括号初始化时,只能初始化第⼀个成员变量共⽤同⼀⽚空间//共⽤体变量的三种引⽤⽅式和结构体变量类似}//初始化⽅式和结构体类似union data{ //类似于结构体变量,共享内存,共⽤体的⼤⼩等于最长的那⼀段,共⽤体变量在任何时刻只有⼀个成员变量存在,定义的时候不能初始化,只有在创建的时候才能初始化 int price;char brand[20];}d1, d2, *pData, data[10];union key{ //共⽤体会存在字节数填充,直到可以被最⼩类型字节数整除,double有8个字节,a数组有9个,再填充7个字节,恰好被double整除//内存对齐的⽅式,分别CPU寻址double d;char a[9];} k; //sizeof(k) =16void main(){printf("%d\n", sizeof(d1)); //20d1.price = 100;strcpy(d1.brand,"IBM");d2 =d1; //共⽤体变量可以直接赋值printf("%d,%s\n",d1.price,d1.brand); //5063241,IBM 只正确显⽰,最后⼀个赋值的变量,其他的数据解析为错误数据,因为他们共⽤⼀段内存union data uniondata = {100 }; //⼤括号初始化时,只能初始化第⼀个成员变量共⽤同⼀⽚空间//共⽤体变量的三种引⽤⽅式和结构体变量类似结构体变量占据的内存单元的个数应当⼤于等于其内部所有数据成员占据内存单元数的和出于效率的考虑,C语⾔引⼊了字节对齐机制,⼀般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通⽤准则:(1)结构体变量的⼤⼩能够被其最宽基本类型成员的⼤⼩所整除;(2)结构体每个成员相对于结构体⾸地址的偏移量(offset)都是成员⼤⼩的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);(3)结构体的总⼤⼩为结构体最宽基本类型成员⼤⼩的整数倍,如有需要编译器会在最末⼀个成员之后加上填充字节(trailing padding)。

c语言第03章

c语言第03章

活期存款一年后本息和为: p1=p0(1+r1) 一年期定期存款,一年后本息和为: p2=p0(1+r2) 两次半年定期存款,一年后本息和为:
r3 r3 p3 = p0(1 + )(1 + ) 2 2
6
3.1顺序程序设计举例

算法:
输入p0,r1,r2,r3的值 计算p1=p0(1+r1) 计算p2=p43; r 3 )
2 2
输出p1,p2,p3
7
3.1 顺序程序设计举例
#include <stdio.h> 定义变量同时赋予初值 int main ( ) {float p0=1000, r1=0.0036,r2=0.0225, r3=0.0198, p1, p2, p3; p1 = p0 * (1 + r1); p2 = p0 * (1 + r2); p3 = p0 * (1 + r3/2) * (1 + r3/2); printf(”%f\n%f\n%f\n”,p1, p2, p3); return 0; }
\„ \ddd \“ 单引号 例 void main() { printf(“Y\b=\n”);\xhh 3位8进制数代表的字符 aaa }
转义字符:反斜线后面跟一个字符或一个代码值表示
<
双引号 运行结果: 2位16进制数代表的字符 屏幕显示:= 15 打印机输出:¥
C语言程序设计
第3章 最简单的C程序设计
19
C语言程序设计
第3章 最简单的C程序设计

3.2.3不同类型数据间的转换
1.隐式转换
什么情况下发生
运算转换------不同类型数据混合运算时 赋值转换------把一个值赋给与其类型不同的变量时 输出转换------输出时转换成指定的输出格式

C02(数据类型)

C02(数据类型)

第 二 章 数 据 描 述
整型常量的类型 问题: 问题: 根据其值所在范围确定其数据类型 0123 = (( 83 ))10 0123 = 10 在整常量后加字母l或L,认为它是long int 型常量 0x123 = (( 291 ))10 0x123 = 10 例 30000= 为int型 ))10 0Xff = (( 255 10 0Xff 12 与 12L 例

运算转换规则:不同类型数据运算时先自动转换 成同一类型
第 二 章 数 据 描 述
<
>

double
float
说明: 必定的转换
long
运算对象类型不同时转换
unsigned

int
char,short
例 int i; float f; double d; long l;
10+„a‟ +i*f int int d/l

整型变量

占字节数随机器不同而不同,一般占一个机器字 short≤int≤long 可用sizeof(类型标识符)测量

实型变量
float:占4字节,提供7位有效数字 double:占8字节,提供15~16位有效数字
例 float a; 字符型变量
第 二 章 数 据 描 述
<
a=111111.111; /* a=111111.1*/ 字符变量存放字符ASCII码 double b; char与int数据间可进行算术运算 b=111111.111; /* b=111111.111*/ 例 a=„D‟; /* a=68; */ 没有字符串变量,用字符数组存放 x=„A‟+5; /* x=65+5; */ s=„!‟+„G‟ /* s=33+71; */ >

C语言各章节单元测试题及答案——结构体与共用体

C语言各章节单元测试题及答案——结构体与共用体

第9章结构体与共用体9.1典型考试题剖析9.1.1选择题【例1】若指针p已经正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是。

A) p=2*(int *)malloc(sizeof(int)); B) p=(int*)malloc(2*sizeof(int));C) p=(int *)malloc(2*2); D) p=(int*)calloc(2,sizeof(int));✧考点:动态存储分配函数。

✧分析:根据动态存储分配函数malloc和calloc的函数原型可以知道,calloc函数的调用形式为:void * calloc(unsigned n,unsigned size);表示在动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配域起始地址的指针,因此答案D是正确的。

malloc函数的调用形式为:void * malloc(unsigned int size);表示是在内存的动态存储区分配一个长度为size的连续空间,并返回一个指向分配域起始地址的指针,答案B和C中malloc的参数分别为:2*(sizeof(int))和2*2,都是整型数,因此调用形式正确。

答案A中(int *)malloc(sizeof(int))的返回值为一个地址值,将地址的值乘以2是没有意义的。

✧答案:A【例2】若有以下说明和定义:struct test{ int m1; char m2; float m3;union uu{ char u1[5]; int u2[2]; }ua;}myaa;则sizeof(struct test)的值是。

A) 12 B) 16 C) 14 D) 9✧考点:结构体类型和共用体类型所占内存的字节数。

✧分析:sizeof(struct test)的功能是求结构体类型test所占用的内存字节数。

它应该等于结构体每个成员所占的字节数之和。

m1为int型,占2字节,m2为char型,占1字节,m3为float型,占4字节,接下来是一个共用体类型uu,共用体所占的字节数应该等于成员中最长者所占的字节数,u1占5字节,u2占4字节,那么该共用体类型应该占用5字节,所以2+1+4+5=12。

(完整版)《C语言程序设计》教案(清华谭浩强)

(完整版)《C语言程序设计》教案(清华谭浩强)

第一章C语言及程序设计概述本章要求:了解C语言的特点、C语言与其它高级语言相比有什么异同;了解C程序在PC机上的建立、编译和运行过程;了解C语言程序设计思想的基本篇;重点:①C语言的主要特点;②C语言在PC机上的运行过程及上机操作过程;③常用算法的应用难点:无一、C语言概述C语言是目前国际上在各种计算机运行较为广泛流行的一种高级语言。

主要表现为:C语言:适合于作为系统描述语言——可用来写系统软件。

具有高级语言的特点,又有低级语言(汇编语言)的特点。

C语言:是AT&T贝尔实验室的Dennis Ritchie在1972年发明的。

C语言:是在B语言的基础上发展起来的。

(ALGOL 60)C语言:最早开始是用于UNIX操作系统。

(C语言和UNIX是相辅相成的)DBASE 、Microsoft Exel 、Microsoft Word、PC-DOS等,则是用C语言加上若干汇编子程序编写的。

1983年:——制定的新标准,称为(美国国家标准化协会)ANSI C 1987年:——Turbo C1.0 (Borland) 1988年:TC 1.5(图形和文本窗口)1989年:——Turbo C2.0 (DOS操作系统、查错、Tiny模式生成com文件)1991年:——Turbo C++(3.0) 支持windows 3.X说明:Turbo C语言可以在程序的任何地方嵌入汇编代码,提高速度,可以直接使用存储器和寄存器。

二.C语言的特点1.语言简洁、紧凑、使用方便、灵活C语言:——共有32个关键字,9种控制语句;程序书写自由,主要用小写字母表示;2.运算符丰富C语言的运算符包含的范围很广泛,共有34种运算符;即:把括号、赋值、强制类型转换都作为运算符处理3.有丰富的数据类型整型、实型、字符型、数据类型、指针类型、结构体类型、共用体(联合)类型等。

实现复杂的数据结构(链表、树、栈、图)的运算。

4.具有结构化的功能,用函数作为程序模块,实现程序的模块化5.语法限制不太严格,程序设计自由度大。

C语言_实验九、结构体程序设计

C语言_实验九、结构体程序设计

实验九、结构体程序设计一、实验目的1.掌握结构、结构数组、结构指针的定义及使用;2.掌握简单的链表的定义及使用;3.掌握共用体和枚举类型的定义及使用;4.掌握文件的简单的定义、打开、写、关闭等操作。

二、实验内容1.[题目内容]某考点建立一个考生人员情况登记表、表格内容如下:1)根据上表正确定义该表格内容要求的数据类型。

2)分别输入各成员项数据,并打印输出(为简便,假设有3个考生)编程序,然后上机调试运行程序。

2.[题目内容]某单位进行选举,有5位候选人:zhang、wang、li、zhao、liu。

编写一个统计每人得票数的程序。

要求每个人的信息使用一个结构体表示,5个人的信息使用结构体数组。

3.[题目内容]设张三20岁、李四22岁、王平23岁,编程输出3人中年龄最小者的姓名和年龄。

4.[题目内容]定义一个学生成绩结构体类型,包含“学号”、“姓名”、“性别”、“年龄”、“班级”、“英语”、“数学”、“物理”、“总分”、“名次”等信息。

编写6个函数分别用于:(1)使用结构体数组,输入全班10名学生的上述信息;(2)计算每一个学生的总分、平均分;(3)计算每一门课程的平均分;(4)查找成绩有不及格的学生信息;(5)按学生成绩总分降序排序;(6)输出全班学生的学号、总分及名次。

5.[题目内容]利用上一题的结构类型,创建包含10个结点的无序链表。

编写5个函数分别实现下述功能(参考前面第三部分内容):(1)显示链表;(2)添加结点;(3)删除结点;(4)计算每位学生的总分;(5)按英语成绩排序。

三、课后作业(写实验报告)1.学生成绩管理:有5个学生,每个学生的数据包括学号、班级、姓名、三门课成绩。

从键盘输入5个学生数据,要求打印出每个学生三门课的平均成绩,以及每门课程平均分、最高分学生数据(包括学号、班级、姓名、三门课成绩,平均分)。

(1)定义学生结构体。

(2)用一个函数实现5个学生数据的输入,用另一个函数负责求每个学生三门课程的平均成绩,再用一个函数求出平均分最高的学生并输出该学生的数据。

C语言结构体与联合体的使用技巧

C语言结构体与联合体的使用技巧

C语言结构体与联合体的使用技巧C语言是一种广泛应用于软件开发领域的编程语言,而结构体和联合体是C语言中非常重要的数据类型。

结构体和联合体的灵活使用可以帮助程序员更好地组织和管理数据,提高代码的可读性和可维护性。

在本文中,我们将探讨一些结构体和联合体的使用技巧。

一、结构体的使用技巧结构体是一种用户自定义的数据类型,它可以将不同类型的数据组合在一起,形成一个新的数据类型。

结构体的定义使用关键字struct,通过定义结构体变量可以访问结构体中的各个成员。

1. 嵌套结构体嵌套结构体是指在一个结构体中定义另一个结构体变量作为成员。

通过嵌套结构体,我们可以更好地组织和管理复杂的数据结构。

例如,我们可以定义一个学生结构体,其中包含学生的基本信息(姓名、年龄等)和成绩信息(语文、数学等)。

这样,我们可以通过一个结构体变量来表示一个学生的完整信息。

2. 结构体指针结构体指针是指指向结构体变量的指针变量。

通过结构体指针,我们可以方便地访问和修改结构体中的成员。

例如,我们可以定义一个指向学生结构体的指针变量,通过该指针变量可以访问和修改学生的各个成员。

这在函数传参和动态内存分配等场景中非常有用。

3. 结构体数组结构体数组是指由多个结构体变量组成的数组。

通过结构体数组,我们可以方便地管理多个具有相同结构的数据。

例如,我们可以定义一个学生结构体数组,通过数组下标可以访问和修改每个学生的信息。

这在需要处理多个学生数据的场景中非常常见。

二、联合体的使用技巧联合体是一种特殊的数据类型,它可以在同一内存空间中存储不同类型的数据。

联合体的定义使用关键字union,通过定义联合体变量可以访问联合体中的各个成员。

1. 节省内存空间联合体可以在同一内存空间中存储不同类型的数据,这样可以节省内存空间。

联合体的大小等于最大成员的大小。

例如,我们可以定义一个联合体,其中包含一个整型成员和一个字符型成员。

当我们只使用其中一个成员时,另一个成员的内存空间就可以被重用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档