上一篇: C语言之复合类型上卷(十八)(阴阳两极)
逐梦编程,让中华屹立世界之巅。
简单的事情重复做,重复的事情用心做,用心的事情坚持做;
文章目录
- 前言
- 一、结构体指针
- 二、结构体嵌套指针
- 三、const修饰的结构体指针变量
- 四、共用体
- 五、大端小端
- 六、共用体验证大小端
- 七、枚举类型
- 八、typedef类型(也叫取别名)
- 总结
- 新壁纸(新年快乐!)
前言
盛年不重来,一日难再晨;及时当勉励,岁月不待人。
一生疏狂尽余欢,半剖肝胆入剑寒;
剑至高危如蜀道,生逢穷途行路难。
不经意间已是2023年了,即将过年了,这或许是今年的最后一篇了,不知道在学习的小伙一年下来收获有多少,这节将为大家带来复合类型的完卷,
本节将学习结构体指针、共用体等知识点;
一、结构体指针
代码示例如下:
/*-----------------------------------【程序说明】----------------------------
* 项目命题: C语言入门篇
* 代码所属: 瑶池酒剑仙(枫之剑客)
* 作者: 阿甘
* 开发时间: 2022/02/15
* IDE 版 本: Visual Studio 2015
* 项目版本: 1.0.0.1
*---------------------------------------------------------------------------*/
//原文链接:https://blog.csdn.net/gzplyx?type=blog
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct t
{
int a;
char name[128];
};
int main()
{
struct t *p = malloc(sizeof(struct t));
p->a = 100;
strcpy(p->name,"hello");
printf("%s\n",p->name);
free(p->name);
free(p);
system("pause");
return 0;
}
二、结构体嵌套指针
代码如下(示例):
/*-----------------------------------【程序说明】----------------------------
* 项目命题: C语言入门篇
* 代码所属: 瑶池酒剑仙(枫之剑客)
* 作者: 阿甘
* 开发时间: 2022/02/15
* IDE 版 本: Visual Studio 2015
* 项目版本: 1.0.0.1
*---------------------------------------------------------------------------*/
//原文链接:https://blog.csdn.net/gzplyx?type=blog
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct t
{
int a;
};
struct tea {
int id;
char *p;
struct t *b;
};
int main()
{
struct tea *tmp =(struct tea *) malloc(sizeof(struct tea));
tmp->id = 100;
tmp->p = (char *)malloc(100);
strcpy(tmp->p,"hello");
//tmp->b->a = 200; err b是野指针, 不能直接赋值b所指向的空间
tmp->b = (struct t *)malloc(sizeof(struct t));
tmp->b->a = 1000;
free(tmp->p);
free(tmp->b);
free(tmp);
system("pause");
return 0;
}
三、const修饰的结构体指针变量
代码如下(示例):
/*-----------------------------------【程序说明】----------------------------
* 项目命题: C语言入门篇
* 代码所属: 瑶池酒剑仙(枫之剑客)
* 作者: 阿甘
* 开发时间: 2022/02/15
* IDE 版 本: Visual Studio 2015
* 项目版本: 1.0.0.1
*---------------------------------------------------------------------------*/
//原文链接:https://blog.csdn.net/gzplyx?type=blog
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct c66
{
int id;
char name[128];
};
int main()
{
struct c66 a;
struct c66 b;
// struct c66 const *p = &a;
//p->id = 100; err const修饰的是*,不能通过指针p取修改p指向的那块空间
struct c66 * const p = &a;
//p = &b; const修饰的是指针变量p,不能修改p本身的内容(指向)
system("pause");
return 0;
}
四、共用体
定义格式:
union 共用体名{
成员列表
};
概念:多个变量共用同一块内存空间’'同一时刻,只能有一个变量起作用
共用体与结构体的区别:
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
五、大端小端
核心思想:
小端:低位存低地址,高位存高地址;
大端:低位存高地址,高位存低地址;
各自的应用:
网络数据用大端;
小型计算机用小端;
本节只做简易介绍,后续如果有开设网络篇章再细讲大端小端的学问,有兴趣的小伙伴可以先查阅百度资料,前期了解意义不大;
六、共用体验证大小端
代码示例如下:
/*-----------------------------------【程序说明】----------------------------
* 项目命题: C语言入门篇
* 代码所属: 瑶池酒剑仙(枫之剑客)
* 作者: 阿甘
* 开发时间: 2022/02/15
* IDE 版 本: Visual Studio 2015
* 项目版本: 1.0.0.1
*---------------------------------------------------------------------------*/
//原文链接:https://blog.csdn.net/gzplyx?type=blog
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
union abc
{
//char a;
short b;
char buf[2];
};
int main()
{
union abc tmp;
tmp.b = 0x0102;
if (tmp.buf[0] == 0x01)
{
printf("big\n");
}
else
{
printf("little\n");
}
system("pause");
return 0;
}
七、枚举类型
规则如下:
1、将枚举类型的变量的值一一列举出来,枚举变量的值只可以赋值为{}里面的值,{}里面的值是常量;
2、枚举{}里面列举的常量的值默认是从0开始;
重点注意的是:
#define命令虽然能解决问题,但也带来了不小的副作用,导致宏名过多,代码松散,看起来总有点不舒服。C语言提供了一种枚举(Enum)类型,能够列出所有可能的取值,并给它们取一个名字。
枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。
代码示例如下:
/*-----------------------------------【程序说明】----------------------------
* 项目命题: C语言入门篇
* 代码所属: 瑶池酒剑仙(枫之剑客)
* 作者: 阿甘
* 开发时间: 2022/02/15
* IDE 版 本: Visual Studio 2015
* 项目版本: 1.0.0.1
*---------------------------------------------------------------------------*/
//原文链接:https://blog.csdn.net/gzplyx?type=blog
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*#define SUN 0
#define RAIN 1
#define SNOW 2 */
enum ab { SUN , RAIN, SNOW};
int main()
{
enum ab tmp = SNOW;
printf("%d %d %d\n",SUN,RAIN,SNOW);
int a = 0;
scanf("%d",&a);
if (SUN == a)
{
printf("sleep\n");
}
else if(RAIN == a)
{
printf("music\n");
}
else if (SNOW == a)
{
printf("game\n");
}
system("pause");
return 0;
}
八、typedef类型(也叫取别名)
作用:typedef 是用来给类型取别名;
定义格式:
typedef 原类型 新类型
总结
以上就是今天要讲的内容,本节介绍了结构体指针、共用体之类的重要知识点,无论是代码实践还是理论知识都应当掌握,
其中共用体在一般的编程中应用较少,在单片机中应用较多;
结构体指针一定要反复练习,还是那句话,学好指针相关等于学会大半个C语言,也是C语言水平的分水岭;
文末了,写文不易,喜欢的小伙伴帮忙动手点个赞收藏下;