C语言初级阶段6——自定义数据类型
阐述
1.构造数据类型:用户自己建立的数据类型(自定义数据类型)。
2.C语言中的自定义数据类型:数组类型、结构体类型、共用体类型和枚举类型。
结构体
1.定义:C语言允许用户根据自己建立的由不同类型数据组成的组合型的数据类型,我们把它称之为结构体(struct)。
2.作用:
结构体能根据用户需要来更方便的储存各种各样的信息。
3.结构体类型的声明和结构体变量的定义
声明一个结构体类型的一般形式为:
struct 结构体类型名{成员列表};
#include<stdio.h>
#include<string.h>
//结构体的定义:struct
/*struct 结构体名
{
结构成员;
}
*/
//怎么访问定义的结构体变量里面的成员 变量名.成员
//定义了一个名字叫做Student的结构
struct Student
{
int ID;
char name[10];
float score;
};
Student ab = { 2,"李四",90.9f };
//Student ab={第一个赋值给第一个定义的成员,第二个值赋值给第二个定义的成员...}
//typedef给类型取别名 #define Π 3.14 宏定义,宏的原理表示替换。
//typedef int 整型;
typedef struct Hero
{
int ATT;
char name[10];
int Def;
}hero;
//定义结构体的时候没有写结构名,那么typedef给这个结构体取别名。
typedef struct
{
int x;
int y;
}STT;
/*定义结构体的时候没写结构名,也没有用typedef取别名,
但是在}后面写了标识符,那么这几个标识符就是我们定义的该结构的变量。
那么这几个标识符就是我们定义的该结构体的变量*/
struct
{
int m;
int n;
}s1,s2,s3[10];
//结构体的嵌套
struct A
{
int f;
struct
{
int g;
}h;
};
struct CC
{
struct A f;
};
//结构体的内存计算方法
struct One
{
int a;
int b;
char c;
};
//内存对齐标准:以该结构体中最大的基本数据类型所占的内存进行对齐
struct Two
{
int a;
char b[10];
float c;
};
struct Three
{
double a;
int b;
char c[10];
};
struct Four
{
int a;
char b[10];
char c;
double d;
};
/*当结构数据成员前面有更大的数据类型所站内存,先按照顺序进行最大的数据类型进行内存分配进行对齐。
如果在最后还有比前面更大的基本数据类型所占内存,那么就按照更大的进行对齐。*/
struct Five
{
char a;
int b;
char c[10];
double d;
};
int main() {
printf("One的字节数为:%d\n", sizeof(One));
printf("Two的字节数为:%d\n", sizeof(Two));
printf("Three的字节数为:%d\n", sizeof(Three));
printf("Four的字节数为:%d\n", sizeof(Four));
printf("Five的字节数为:%d\n", sizeof(Five));
CC cc;
cc.f.h;
A fff;
fff.h.g;
hero arr[4] = {
{10,"剑圣",5},
{5,"盖伦",10},
{0,"法师",0}
};
for (int i = 0; i < 3; i++)
{
printf("%d\t%s\t%d\n", arr[i].ATT, arr[i].name, arr[i].Def);
}
s3[0] = { 1,2 };
s1 = { 1,2 };
STT tt;
hero YX1 = { 10,"剑圣",5 };
int a = 10;
int b = 20;
Student aa = { 1,"张三",60.1f};
aa.ID = 10;
strcpy(aa.name,"张三");
aa.score = 1.6f;
//aa.name="张三";这是不可以的。
return 0;
}
共用体
1.关键字:union
2.有时候想用同一段内存单元存放不同类型的变量。如:把一个整型变量、浮点型变量和字符型变量放在同一个内存单元中,它们在内存中所占字节数不同,但是共用同一段内存地址,也就是共用体。
3.也就是所有数据成员共用同一段内存的数据类型称为共用体,也称其为联合体。
4.共用体和结构体的声明、定义和成员变量引用的语法是类似的,只不过关键字不一样,以及所占内存大小有区别而已。
#include<stdio.h>
#include<string.h>
/*内存储存:共用体所有的成员共用里面最大的成员的空间,在同一个时刻只能存储一个成员的值。
只算最大的成员所占的内存,要以共用体中最大的基本数据类型所占内存进行对齐。*/
union Arr
{
int c;
char a[10];
float b;
};
int main() {
printf("Arr的字节数为:%d\n", sizeof(Arr));
return 0;
}
枚举类型
1.关键字:enum
#include<stdio.h>
#include<string.h>
/*枚举类型内存大小:就是int类型的所占内存大小
枚举的元素会有一个默认的值,是整数,第一个元素默认的值为0 第n个元素的值是第n-1个元素的值+1*/
enum Arr1
{
left,
right,
up,
down
};
int main() {
printf("Arr1的字节数为:%d\n", sizeof(Arr1));
return 0;
}
#include<stdio.h>
#include<string.h>
#include<conio.h>
enum {up='w',down='s',right='d',left='a' };
int main() {
while (1)
{
switch (_getch()) {
case up:
printf("你按了上这个键\n");
break;
case down:
printf("你按了下这个键\n");
break;
case left:
printf("你按了左这个键\n");
break;
case right:
printf("你按了右这个键\n");
break;
}
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<conio.h>
typedef enum {up='w',down='s',right='d',left='a' } Arr3;
int main() {
Arr3 a;
printf("%d\n", up);
return 0;
}
#include<stdio.h>
#include<string.h>
#include<conio.h>
typedef enum {up='w',down='s',right='d',left='a' } Arr3;
enum Arr4
{
a,b,c,d,e,f
};
int main() {
printf("%d\n", up);
printf("%d\n%d\n%d\n%d\n%d\n%d\n", a, b, c, d, e, f);
return 0;
}
#include<stdio.h>
#include<string.h>
#include<conio.h>
typedef enum {up='w',down='s',right='d',left='a' } Arr3;
enum Arr4
{
a,b,c=10,d,e,f
};
int main() {
printf("%d\n", up);
printf("%d\n%d\n%d\n%d\n%d\n%d\n", a, b, c, d, e, f);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)