C语言进阶——自定义类型:结构体 枚举 联合

简介: C语言进阶——自定义类型:结构体 枚举 联合

1. 结构体结构体类型的声明
1.1 结构的基础知识

1.2 结构的声明
struct tag
{

member-list;

}variable-list;

struct Stu
{

char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号

}; //分号不能丢
struct stu
{

//属性
char name[20];
int age[10];

}s1,s2;

1.3 匿名结构体类型

//匿名结构体类型
struct
{

//属性
char name[20];
int age[10];

}s1;

define _CRT_SECURE_NO_WARNINGS

include<stdio.h>

struct
{

char name[20];
int age[20];

}x;
struct
{

char name[20];
int age[20];

}s1[20], * p;
int main()
{

p = &x;
return 0;

}

  1. 结构的自引用

struct Node
{

int data;
struct Node* next;

};

  1. 结构体变量的定义和初始化

struct Point
{

int x;
int y; 

}p1; //声明类型的同时定义变量p1

struct Pointp2; 
//定义结构体变量p2

struct Stu        //类型声明
{

 char name[15];//名字
 int age;      //年龄

};
struct Stus = {"zhangsan", 20};//初始化

struct Node
{

int data;
struct Pointp; 
struct Node* next;

}n1= {10, {4,5}, NULL}; //结构体嵌套初始化

struct Node2= {20, {5, 6}, NULL};//结构体嵌套初始化

  1. 结构体内存对齐

define _CRT_SECURE_NO_WARNINGS

include<stdio.h>

struct s1
{

char c1;
char c2;
int i;

};
struct s2
{

char c1;
int i;
char c2;

};
int main()
{

printf("%d\n", sizeof(struct s1));
printf("%d\n", sizeof(struct s2));

return 0;

}

define _CRT_SECURE_NO_WARNINGS

include<stdio.h>

include<stddef.h>

struct s1
{

char c1;
int i;
char c2;

};
int main()
{

printf("%d\n",offsetof(struct s1,c1));
printf("%d\n",offsetof(struct s1, i));
printf("%d\n",offsetof(struct s1, c2));

return 0;

}

struct S
{

char c;
int i;

};
struct S s;

define _CRT_SECURE_NO_WARNINGS

include<stdio.h>

//#pragma pack(4)
struct s1
{

int c1;
double c2;

};

int main()
{

printf("%d\n", sizeof(struct s1));
return 0;

}

define _CRT_SECURE_NO_WARNINGS

include<stdio.h>

pragma pack(4)

struct s1
{

int c1;
double c2;

};

int main()
{

printf("%d\n", sizeof(struct s1));
return 0;

}

  1. 结构体传参

struct S
{

int data[1000];
int num;

};
struct S s = { {1,2,3,4}, 1000 };

//结构体传参
void print1(struct S s)
{

printf("%d\n", s.num);

}

//结构体地址传参
void print2(struct S*ps)
{

printf("%d\n", ps->num);

}

int main()
{

print1(s); //传结构体 
print2(&s); //传地址 
return 0;

}

  1. 结构体实现位段

6.1 什么是位段

struct A
{

//4byte=32bit
int_a:2;
int_b:5;
int_c:10;
//余15
4byte=32bit
int_d:30;

};

printf("%d\n", sizeof(struct A));
6.2 位段的内存分配

struct S
{

char a : 3;
char b : 4;
char c : 5;
char d : 4;

};
int main()
{

struct S s = { 0 };
printf("%d\n", sizeof(struct S ));
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;
return 0;

}

 6.3 位段的跨平台问题

6.4 位段的应用

7.枚举

7.1 枚举类型的定义

define _CRT_SECURE_NO_WARNINGS

include<stdio.h>

enum Day//星期
{

Mon = 1,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun

};
int main()
{

printf("%d\n", Mon);
printf("%d\n", Tues);
printf("%d\n", Wed);
printf("%d\n", Thur);
printf("%d\n", Fri);
printf("%d\n", Sat);
printf("%d\n", Sun);

}

7.2 枚举的优点

7.3 枚举的使用
enum Color

//颜色

{

RED=1,
GREEN=2,
BLUE=4

};
enum Color clr = GREEN;
//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr = 5;

  1. 联合(共用体)

8.1 联合类型的定义

union Un
{

char c;
int i;

};
union Un un;
int main()
{

printf("%d\n", sizeof(un));
printf("%d\n", &(un));

printf("%d\n", &(un.c));
printf("%d\n", &(un.i));

}

8.2 联合的特点

union Un
{

char c;
int i;

};
union Un un;
int main()
{

printf("%d\n", &(un.c));
printf("%d\n", &(un.i));

un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);

}

int check_sys()
{

int a = 1;
return *(char*)&a;

}
int main()
{

int ret = check_sys();
if (ret == 1)
{
    printf("小端\n");
}
else
{
    printf("大端\n");
}

}

int check_sys()
{

union Un
{
    char c;
    int i;
}u;
u.i = 1;
return u.c;

}
int main()
{

int ret = check_sys();
if (ret == 1)
{
    printf("小端\n");
}
else
{
    printf("大端\n");
}

}

8.3 联合大小的计算

union Un1
{

char c[5];
int i;

};
union Un2
{

short c[7];
int i; };

int main()
{

//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
return 0;

}

相关文章
|
11天前
|
存储 C语言
C语言程序设计核心详解 第九章 结构体与链表概要详解
本文档详细介绍了C语言中的结构体与链表。首先,讲解了结构体的定义、初始化及使用方法,并演示了如何通过不同方式定义结构体变量。接着,介绍了指向结构体的指针及其应用,包括结构体变量和结构体数组的指针操作。随后,概述了链表的概念与定义,解释了链表的基本操作如动态分配、插入和删除。最后,简述了共用体类型及其变量定义与引用方法。通过本文档,读者可以全面了解结构体与链表的基础知识及实际应用技巧。
|
16天前
|
C语言
c语言中的结构体
本文档详细介绍了C语言中结构体的使用方法,包括结构体的基本定义、变量声明与赋值、数组与指针的应用,以及结构体嵌套、与`typedef`结合使用等内容。通过示例代码展示了如何操作结构体成员,并解释了内存对齐的概念。
|
22天前
|
C语言
C语言结构体赋值的四种方式
本文总结了C语言结构体的四种赋值方式,并通过示例代码和编译运行结果展示了每种方式的特点和效果。
35 6
|
1月前
|
编译器 程序员 Linux
【C语言篇】结构体和位段详细介绍
跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。
|
1月前
|
存储 编译器 C语言
【C语言篇】自定义类型:联合体和枚举详细介绍
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
|
8天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
11天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
11天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
16天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
16天前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。