结构体、共用体、用户自定义

合集下载

7、用户自定义数据类型

7、用户自定义数据类型

7、⽤户⾃定义数据类型1、结构体 1.1、结构体的定义 在实际的处理对象中,有许多信息是由多个不同类型的数据组合在⼀起进⾏描述,⽽且这些不同类型的数据是互相联系组成了⼀个有机的整体。

此时,就要⽤到⼀种新的构造类型数据-----结构体,简称结构。

结构体的使⽤为处理复杂的数据结构(如动态数据结构等)提供了有效的⼿段,⽽且,它们为函数间传递不同类型的数据提供了⽅便。

结构体和数组⼀样,也是⼀种构造型数据类型,是⽤户⾃定义的新数据类型,在结构体中可以包含若⼲个不同数据类型和不同意义的数据项(当然也可以相同),从⽽使这些数据项组合起来反映某⼀个信息。

结构体是⼀种构造数据类型,结构体的语法如下:Struct 结构体名{数据类型成员名1;数据类型成员名2;数据类型成员名3;….数据类型成员名n;}; 在花括号中的内容也称为“成员列表”或“域表”。

其中每个成员的命名规则与变量名相同,成员之间⽤“;”作为结束符,整个结构的定义也⽤“;”作为结束符,数据类型可以是基本变量类型、数组类型、结构体类型、联合体类型或枚举类型等。

先定义结构体类型,再定义结构体变量。

结构体中的成员名可以与程序中的变量名相同,⼆者并不代表同⼀对象,编译程序可以⾃动对它们进⾏区分。

定义结构体类型时不会分配空间,只有⽤结构体类型定义变量时才会分配空间。

总结⼀下结构体类型的特点: (1)、结构体类型是⽤户⾃⾏构造的 (2)、它由若⼲不同的基本数据类型的数据构成 (3)、它属于C语⾔的⼀种数据类型,与整形、浮点型相当。

因此,定义它是不分配空间,只有⽤它定义变量时才分配空间。

1.2、结构体变量的声明、使⽤及初始化 1.2.1、结构体变量的声明 在定义了结构体类型后,就可以声明结构体类型的变量。

有下⾯⼏种形式: (1)、先定义结构体类型,再定义变量名Struct 结构体名{类型成员名;类型成员名;};Struct 结构体名变量名1,变量名2…;这⾥的结构体名是结构体的标识符,不是变量名。

考研C语言知识点梳理

考研C语言知识点梳理

考研C语言知识点梳理C语言是一门通用的编程语言,常用于系统软件开发和应用软件开发中。

对于考研的计算机专业考生来说,掌握C语言的基本知识点是非常重要的。

本文将对考研C语言知识点进行梳理,以帮助考生更好地备考。

一、基本语法和数据类型1. 变量和常量:变量是用来存储数据的内存空间,常量是不可改变的值。

2. 数据类型:C语言支持多种数据类型,包括整型、浮点型、字符型和指针等。

3. 标识符和关键字:标识符是用来标识变量、函数和其他用户自定义的对象,关键字是具有特殊含义的标识符。

4. 运算符:C语言中包含算术运算符、关系运算符、逻辑运算符等。

二、控制语句1. 分支语句:C语言中的分支语句主要包括if语句、switch语句等,用于根据条件执行不同的代码块。

2. 循环语句:C语言中的循环语句主要包括for循环、while循环和do-while循环,用于重复执行一段代码块。

3. 跳转语句:C语言中的跳转语句包括break语句、continue语句和goto语句,用于在循环或者分支语句中跳出或者跳转到指定位置。

三、函数和数组1. 函数的定义和调用:函数是一段封装了特定功能的代码块,可以通过函数名进行调用。

2. 函数的参数和返回值:函数可以接受参数并返回一个值。

3. 数组的定义和使用:数组是一组相同类型的元素的集合,可以通过下标访问和修改数组中的元素。

四、指针和内存管理1. 指针的概念和基本操作:指针是一个存储内存地址的变量,可以通过指针访问和修改内存中的数据。

2. 动态内存分配:C语言提供了动态内存分配的机制,通过malloc()函数和free()函数来管理内存。

3. 指针和数组的关系:指针和数组在C语言中有着密切的联系,可以通过指针来操作数组。

五、文件操作1. 文件的打开和关闭:使用fopen()函数打开文件,使用fclose()函数关闭文件。

2. 文件的读写操作:使用fscanf()函数和fprintf()函数进行文件的读写操作。

2级C语言第14章 结构体共用体和用户定义类型

2级C语言第14章 结构体共用体和用户定义类型

例 struct student { int num; char name[20]; char sex; } stu1[2]={{112,“Wang Lin”,„M‟},{19, “Li Jia”, „W‟};
struct 形式三: { 类型标识符 成员名; 类型标识符 成员名; ……………. 不管那种赋值,不允许跳过前面的成员给后 }结构体变量={初始数据}; 面的成员赋值,但可以只给前面的成员赋值
例 ,后面未赋值的数值数据按0处理,字符数据 struct { int num; 按‘\0‟,字符串数据按空串处理。 char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,„M‟,19, “200 Beijing Road”};
二、 结构体变量的定义
1. 先定义结构体类型,再定义结构体变量 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; struct student stu1,stu2; STU stu1,stu2; #define STU struct student STU { int num; char name[20]; char sex; int age; float score; char addr[30]; };
2. 定义结构体类型的同时定义结构体变量
struct student struct
{ int num;
{ int num; 用无名结构体直接定义 char name[20]; char name[20]; 变量只能一次 char sex; char sex; int age; int age; float score; float score; char addr[30]; char addr[30]; }stu1,stu2; } stu1,stu2;

C程序设计(第四版)第7章结构体与共用体

C程序设计(第四版)第7章结构体与共用体

7.1.1
结构体类型的定义
结构体在说明和使用之前,必须先由用 户自己定义。结构体定义的一般形式如下: struct 结构体名 { 成员类型说明符 成员项1; 成员类型说明符 成员项2; …… 成员类型说明符 成员项n; };
其中: 1、struct是C语言中定义结构体的关键字。 2、成员类型说明符是说明每个成员项的数 据类型,可以是基本数据类型,也可以是数组 类型,还可以是另一个已定义的结构体类型。 3、成员名可以和程序中的变量名相同,两 者不代表同一对象。 4、要注意,在结构体定义中的右括号后应 该有分号。
7.1.6
指向结构体的指针
一个结构体类型的数据在内存中都占据一定 的存储空间,我们可以定义一个指针来指向该 结构体类型的数据,该指针变量称为指向结构 体的指针,简称之为结构体指针。我们可以通 过结构体指针来访问结构体类型的数据,如结 构体变量、结构体数组。指向结构体的指针变 量说明形式如下: struct 结构体类型名 *结构体指针变量名;
main() { struct student stu1; struct student *p; p=&stu1; stu1.num=50201001; gets(); stu1.score=89.5;
printf(“No:%ld\nName:%s\nScore:%4.1f\n”,stu1 .num,,stu1.score); printf(“No:%ld\nName:%s\nScore:%4.1f\n”,(*p). num,(*p).name,(*p).score);
3、结构体数组应用举例 【例7-2】现有三个候选人(每个候选人的ID 号分别是1、2、3),选举人投票进行选举, 编写程序统计出每个候选人的得票结果。 程序如下: #define NUM 30 #include <stdio.h> struct elector { int id; char name[20]; int count;

C语言 第八章.用户自定义数据类型

C语言   第八章.用户自定义数据类型
printf("%c,%c\n",u2.c[0],u2.c[1]); }
u2占2个字节
例:以下程序输出结果是?
union example { struct { int x,y; e.b e.a e.in.x }in; e.in int a; e.in.y int b; }e; void main() { e.a=1;e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf("%d,%d",e.in.x,e.in.y); }
内存低地址 01100001 00001010
字符变量c占1个字节
整型变量i占2个字节 单精度实型变量f占4个字节
u1.i=10;
例:以下程序输出结果是?
union u_type { char c[2]; u1
p
内存高地址 内存低地址 ‘a’ ‘b’ c1 c2 c[1] c[0] u1占2个字节 内存高地址 内存低地址 ‘A’ ‘B’ ‘a’ ‘b’ c1 c2 c[1] c[0]
{"0208103322","lisi",19,'M'},{"0208103323","lili",20,'F'}, {"0208103324","xulin",21,'M'}};
学号(number) 姓名(name) 年龄(age) 性别(sex)
stu[0] stu[1] stu[2] stu[3]
char name[8];
int age; char sex;
定义结构体类 sizeof(stu) 型的同时创建 =? 结构体数组

C语言教程之结构体共用体与位运算

C语言教程之结构体共用体与位运算

C语言教程之结构体共用体与位运算C语言是一种功能强大的编程语言,它提供了许多用于处理复杂数据类型的特性。

其中,结构体、共用体和位运算是三个重要的特性,可以帮助开发者更高效地处理数据。

本教程将介绍C语言中的结构体、共用体和位运算,并给出一些实例和使用场景。

1. 结构体(Structures)结构体是C语言中一种用户自定义的数据类型,可以将不同类型的数据组合在一起,形成一个新的复合数据类型。

结构体通过关键字"struct"来定义,可以在其中定义多个成员变量,并且可以根据需要为每个成员变量指定不同的数据类型。

例如,我们可以定义一个结构体来表示一个学生的信息:```struct studentchar name[20];int age;float grade;};```上面的代码定义了一个名为`student`的结构体,包含了三个成员变量:`name`,`age`和`grade`,分别表示学生的姓名、年龄和成绩。

使用结构体时,可以通过`.`操作符来访问结构体的成员变量,就像访问一个普通的变量一样。

例如,我们可以通过以下方式给结构体的成员变量赋值:```struct student stu1;strcpy(, "John");stu1.age = 18;stu1.grade = 90.5;```2. 共用体(Unions)共用体是C语言中一种特殊的数据类型,它和结构体类似,也可以包含多个成员变量,不同之处在于,共用体的成员变量共享同一块内存空间。

即,共用体的所有成员变量在内存中的起始地址是相同的,它们共同占用一段连续的内存空间。

共用体的定义方式与结构体类似,只是将关键字"struct"换成了"union"。

例如,我们可以定义一个共用体来表示一个变量的多种不同数据类型的解释:```union dataint i;float f;char str[20];};```上面的代码定义了一个名为`data`的共用体,包含了三个成员变量:`i`,`f`和`str`,分别表示整数、浮点数和字符数组。

C语言中的结构体和共用体(联合体)

C语言中的结构体和共用体(联合体)

C语言中的结构体和共用体(联合体)/c-pointer-array/在C 语言中,结构体(struct)是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。

由于结构体将一组相关变量看作一个单元而不是各自独立的实体,因此结构体有助于组织复杂的数据,特别是在大型的程序中。

共用体(union),也称为联合体,是用于(在不同时刻)保存不同类型和长度的变量,它提供了一种方式,以在单块存储区中管理不同类型的数据。

今天,我们来介绍一下C 语言中结构体和共用体的相关概念和使用。

结构体 / struct结构体的定义声明一个结构体类型的一般形式为:struct 结构体名 {成员列表};其中,成员列表中对各成员都应进行类型声明,即:类型名成员名;例如,我们需要在程序中记录一个学生(student)的数据,包括学号(num)、姓名(name)、性别(sex)、年龄(age)、成绩(score)、地址(addr)等,如下图所示:如果要表示图中的数据结构,但C 语言并没有提供这种现成的数据类型,因此我们需要用定义一种结构体类型来表示。

truct student {int num;char name[20];char sex;int age;float score;char addr[30];};上述定义了一个新的结构体类型 struct student(注意,struct 是声明结构体类型时所必须使用的关键及,不能省略),它向编译系统声明,这是一个“结构体类型”,它包括 num、name、sex、age、score、addr 等不同类型的数据项。

应当说,这里的 struct student 是一个类型名,它与系统提供的标准类型(如 int、char、float、double 等)具有同样的作用,都可以用来定义变量的类型。

结构体变量前面只是声明了一个结构体类型,它相当于一个模型,但其中并无具体的数据,编译系统对其也不分配实际的内存单元。

c语言中各种数据类型

c语言中各种数据类型

c语言中各种数据类型C语言中的各种数据类型在C语言中,数据类型是非常重要的概念。

它定义了变量的类型及其在内存中所占据的空间大小。

C语言中有多种数据类型,包括基本数据类型和派生数据类型。

本文将依次介绍这些数据类型,并给出一些使用示例。

1. 基本数据类型1.1 整型(int)整型是C语言中最常用的数据类型之一。

它用于表示整数,包括正整数、负整数和零。

整型的大小取决于机器的架构,但通常情况下,int类型占用4个字节的内存空间。

下面是一个整型变量的声明和赋值的示例:```int num = 10;```1.2 浮点型(float和double)浮点型用于表示实数,包括小数和指数形式的数。

C语言中提供了两种浮点型:float和double。

float类型占用4个字节的内存空间,而double类型则占用8个字节的内存空间。

下面是一个浮点型变量的声明和赋值的示例:```float pi = 3.14;double e = 2.71828;```1.3 字符型(char)字符型用于表示单个字符,它占用1个字节的内存空间。

在C语言中,字符型变量使用单引号来表示。

下面是一个字符型变量的声明和赋值的示例:```char ch = 'A';```2. 派生数据类型2.1 数组(array)数组是一种派生数据类型,它可以存储多个相同类型的元素。

数组的大小在声明时指定,并且在程序运行期间不能改变。

下面是一个整型数组的声明和赋值的示例:```int nums[5] = {1, 2, 3, 4, 5};```2.2 结构体(struct)结构体是一种可以包含多个不同类型变量的数据类型。

它可以将不同类型的变量组合在一起,形成一个逻辑上的整体。

下面是一个结构体的声明和使用的示例:```struct Student {char name[20];int age;float score;};struct Student stu;strcpy(, "Alice");stu.age = 18;stu.score = 95.5;```2.3 枚举(enum)枚举是一种用户自定义的数据类型,它可以定义一组具有名称的常量。

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

结构体、共用体、用户自定义类型int、char、float、double等都是系统预定义的标准数据类型。

程序员用这些类型声明符声明需要的变量,系统就会为它们分配相应的存储空间,按特定的存储方式进行存储,并在有关运算符作用于这些数据时进行合法性检查。

除此之外,C语言还允许程序员在一定的框架范围内定制需要的数据类型。

声明了类型之后,程序员就可以使用它们来定义需要的变量,如同使用系统提供的int、char、float、double等一样。

C语言允许程序员定制的数据类型是在下面的5种类型框架内进行。

这5种框架分别是:·结构体(struct):也称集合数据类型,用于将不同类型的数据组织在一个名字下·共用体(union):允许一个存储空间中存储不同类型的变量。

· typedef:用于为已经存在的类型定义新名字。

一、用typedef定义类型Typedef 类型名标识符1、简单的名字替换typedef int INTEGER;•意思是将int型定义为INTEGER,这二者等价,在程序中就可以用INTEGER作为类型名来定义变量了。

INTEGER a,b;/*相当于int a,b;*/•定义a,b为INTEGER类型,也即int类型。

下面是一个解释例:①首先按通常定义变量的方法定出定义的主体char *p;②将变量名换成新类型名:char *CHAR;③在量后面加上关键字typedef;typedef char *CHARP④可以用新类型名定义变量了:CHARP p;二、结构体类型1、定义结构变量的一般格式为:struct 结构名{类型变量名;类型变量名;...} 结构变量;结构名是结构的标识符不是变量名例如:struct date{int y,month,day;}说明:结构体类型名不仅可以是简单数据类型,也可以是构造类型,当然也可以是基种结构体类型。

当结构体说中又包含结构体时,称其为结构体的嵌套。

如下:struct student{char name[12];char sex;struct date birthday;float sc[4];};若没的事先说明这一类型,以上结构类型说明可改定为如下形式:struct student{char name[12];char sex;struct date{int y,month,day;}birthday;float sc[4];};建立通信录定制一种数据类型struct Addr:truct Addr{char name[30]; /* 姓名*/char street[40]; /* 街道*/char city[20]; /* 城市*/char provn[20]; /* 省名*/unsigned int zip; /* 邮编*/}2、结构体类的变量、数组和指针变量和定义可以用以下四种方法定义结构体类型的变量、数组和指针变量。

紧跟在结构体类型说明之后说进行定义。

struct student{char name[12];char sex;struct date birthday;float sc[4];}std,pers[3],*pstd;在说明一个无名结构体类型的同时,直接进行定义;如:struct{char name[12];char sex;struct date birthday;float sc[4];};struct std,pers[3],*pstd;先说明结构体类型,再单独进行变量定义。

struct student{char name[12];char sex;struct date birthday;float sc[4];};struct student std,pers[3],*pstd;使用typedef说明一个结构体类型名,再用新类型来定义变量。

3、定义结构体类型变量及对变量的初始化定制一个结构体类型后,得到一个结构体类型名。

有了这个类型名,就可以像int、char、float和double一样,用来定义一些结构体类型的变量。

定义了变量,系统就会为变量分配存储空间。

• 1. 定义结构体变量可以采用不同的方法定义一个结构体类型的变量。

(1)在定义了一个结构体类型之后,把变量定义为该类型。

如有以下声明:struct Student stdnt1, stdnt2, stdnt3;•定义了stdnt1、stdnt2,和stdnt3三个struct Student类型的结构体变量。

注意不能写成:struct Student ,stdnt1, stdnt2, stdnt3; /* 错误逗号*/也不能写成Student stdnt1, stdnt2, stdnt3; /* 缺少关键字struct•结构体变量的初始化在定义了结构体变量之后,stdnt1, stdnt2, stdnt3等就具有struct Student结构体类型的特征,也有了变量的特征。

但是,这些变量不是简单变量,它们的值也不是一个简单的整数、实数或字符等,而是由许多个基本数据组成的复合的值。

例如,stdnt1、stdnt2和stdnt3的值可以有如图7.1所示的值•那么,如何对结构体变量进行初始化呢?与简单变量的初始化类似,结构体变量的初始化应当在变量定义时进行,并且要把初始值依次写在一对花括号内,用赋值运算符赋值给对应的变量。

如struct Student{unsigned int num;char name[20];char sex;int age;float score;char addr[30];} stdnt1={50201,”ZhangXi”,’M’,18,90.5,”Shanghai”},stdnt2={50202,”WhangLi”,’F’,19,88.3,”Beijing”};•也可以用以下形式Struct Student stdnt3={50203,”LiHong”,’M’,17,79.9,”Shanxi”}; /***** ex070101 ***/struct Student{unsigned int num;char name[20];char sex;unsigned char age;float score;};#include <stdio.h>int main(void){struct Student student1={50201,“WangLi”,’M’,18,89.5};struct Student student2;student2=student1; /* 结构体变量间赋值*/printf (“student1: %u,%s,%c,%u,%5.2f\n”, student1.num,\ ,student1.sex,student1.age,student1.score);printf (“student2: %u,%s,%c,%u,%5.2f\n”, student2.num,\ ,student2.sex,student2.age,student2.score);return 0;}•在执行“student2=student1;”这个赋值语句时,将student1变量中各个成员逐个依次赋给student2中相应各个成员。

显然,这两个结构体变量的类型应当相同才行。

•注意:不允许用赋值语句将一组常量直接赋给一个结构体变量。

如下面语句不合法:student1={50203,“WangLong“,19,’F’,89.5};4、引用结构体变量中的数据①结构体变量名.成员名②指针变量名- >成员名③(*指针变量名).成员名使用指向结构体变量的指针引用结构体变量的成员/***** ex070801 ***/#include <string.h>#include <stdio.h>struct StudType{char name[16];long num;int age;char sex;float score;};int main(void){struct StudType student,*p;/* 使用结构体变量引用成员*/strcpy (,"Wang Li");student.num=50101;student.age=18;student.sex='m';student.score=89.5;/* 使用指向结构体变量的指针引用成员*/p=& student;printf("\nname:%s\nnumber:%1d\nage:%d\nsex:%c\nscore:%6.2f\n",\(*p).name,(*p).num,(*p).age,(*p).sex,(*p).score);return 0;}5、相同类型结构体变量之间的数据传递例:Struct{Char name[10];Int num;}per1,per2={“YANGGM”,46};赋值:per1=per26、函数之间结构体变量的数据传递①向函数传递结构体变量中单个成员的数据②向函数传递整个结构体变量中的数据③传递结构体变量的地址#include <stdio.h>typedef struct{char s[10];int t;}ST;getdata(ST*p){scanf("%s%d",p->s,&p->t);}main(){ST a;getdata(&a);printf("%s,%d\n",a.s,a.t);}④向函数传递结构体名#include <stdio.h>typedef struct{int num;double mark;}REC;void sub1(REC x){x.num=23;x.mark=81.5;}void sub2(REC y[]){y[0].num=12;y[0].mark=77.5;}main(){REC a={16,90.0},b[]={16,90.0};sub1(a);printf("A)%d,%5.1lf\n",a.num,a.mark);sub2(b);printf("B)%d,%5.1lf\n",b[0].num,b[0].mark);}⑤函数的返回值是结构体类型#include <stdio.h>typedef struct{int a;char b;}ST;ST fun(ST x){x.a=99;x.b='S';return x;}void main(){ST y;y.a=0; y.b='A';printf("y.a=%dy.b=%c\n",y.a,y.b);y=fun(y);printf("y.a=%dy.b=%c\n",y.a,y.b);}⑥函数的返回值可以是指向结构体变量的指针类型#include <stdio.h>typedef struct{int a;char b;}ST;ST *fun(ST x){ST *px;x.a=100;x.b='C';px=&x;return px;}void main(){ST y,*p;y.a=999;y.b='X';printf("y.a=%dy.b=%c\n",y.a,y.b);p=fun(y);printf("(*p).a=%d(*p).b=%c\n",(*p).a,p->b); }输入3个学生的信息并将它们输出/*** ex070701 ***/#include <stdlib.h>#include <stdio.h>#define StuNUM 3struct StudType{char name[16];long num;int age;char sex;float score;};int main(void){struct StudType stu[StuNUM];int i;char ch;char numstr[16];/* 输入数据*/for (i=0;i<StuNUM;i++){printf ("\nenter all data of stu[%d]:\n",i); gets (stu[i].name);gets (numstr);stu[i].num=atol (numstr); gets (numstr);stu[i].age=atoi(numstr);stu[i].sex=getchar();ch=getchar();gets (numstr);stu[i].score=atof(numstr);}/* 输出数据*/printf ("\n record name \t \t num\tage\tsex\tscore\n");for (i=0;i<StuNUM;i++)printf ("%d\t%-16s%-8d%d\t%-c\t%6.2f\n",i,stu[i].name,\ stu[i].num,stu[i].age,stu[i].sex,stu[i].score); return 0;}/*** ex070702 ***/#include <stdlib.h>#include <stdio.h>#define StuNUM 3 struct StudType{Char name[16]; long num;int age;char sex;float score;};int main(void){struct StudType stu[StuNUM],*p;int i;char numstr[16];/* 输入数据*/for (i=0,p=stu;p<stu+StuNUM;p++,i++){printf ("\nenter all data of stu[%d]:\n",i);gets (p->name);gets (numstr);p->num=atol (numstr);gets (numstr);p->age=atoi (numstr);p->sex=getchar( );getchar( );gets (numstr);p->score=atof (numstr);}/* 输出数据*/printf ("\n record name \t \t num\tage\tsex\tscore\n");for (i=0,p=stu;p<stu+StuNUM;p++,i++)printf ("%d\t%-16s%-8d%d\t%-c\t%6.2f\n", \i,p->name,p->num,p->age,p->sex,p->score);return 0;}三、利用结构体变量构成的链表1、结构体中含的可以指向本结构体的指针成员当一个结构体中的一个或多个成员的基类型就是本结构体类型时,通常把这种结构体称为可以“引用自身的结构体”。

相关文档
最新文档