蛋哥C语言剖析第二课和比特鹏哥之结构体,枚举,联合类型笔记

蛋哥之C语言关键字static和sizeof

	@[TOC](目录)

extern-> static知识:

对于跨文件来说,extern关键字可以对不同文件里的变量及函数进行声明,可以使用其他文件的变量和函数,但是考虑多文件代码的维护性,这里我们对每个源代码.c 所包含的全局变量和函数用一个相同名称的文件名,然后后缀名为.h文件来命名,维护.
这是头文件利用extern来声明
test.c源代码文件来实现功能main入口文件对test.h头文件进行引入
但是如果在test.c文件中把所有的变量和函数带入一个static关键字.我们来看看效果
错误提示
结论:加入static相当于改变原来的作用域范围,作用域范围只是本文件程序代码范围有效果,其他的不能访问🥂❤

我来在来思考:
static如果是在局部范围内呢,那么我们看代码片段:
代码片段
==从这个代码我们可以看出,static是在静态代码区内,也就是说在调用gs的一开始就已经定义了static变量 x 的值为55,所以每次调用都会++静态值.所以不随着函数的释放而释放变量x.
操作系统,代码结构图
结构图

sizeof知识:

sizeof是对C语言的数据申请内存空间大小的一个操作符.代码如下:在X86环境下:
在这里插入图片描述

鹏哥之结构体类型讲解

什么是结构体?

\结构体,是一组数据,类似数组,但是数组只能存放同一种类型,结构体可以存放不同数据类型,他是属于构造类型.

我们用代码来表示下,如何定义一个结构体,这里我们以学生为例子

	struct Stu
	{
		int age;//年龄
		char name[20];//名字
		double higth;//身高
	}

这里只是声明了一个结构体,学生类型,我们如何创建一个结构体变量呢?

	struct Stu
	{
		int age;//年龄
		char name[20];//名字
		double higth;//身高
	}student={12,"张三",180.0};

在main函数外部创建声明的话属于全局变量,在函数内部如何定义呢.

#include<stdio.h>
	struct Stu
	{
		int age;//年龄
		char name[20];//名字
		double higth;//身高
	};
	int main()
	{	struct Stu student ={.age=10,.name="张三",.higth=180.0};
		return 0;
	}

那么枚举的类型大小是如何确定的呢?
1.可以使用offsetof宏来实现每个结构体成员的偏移量.使用#include<stddef.h>来实现
在这里插入图片描述
2.确定内存申请空间大小的规律,成员变量内存申请空间,一般来说VS编译器中默认是8个字节的,但是gcc编译器是按照实际的类型内存大小决定的.打个比方,这里struct Stu类型中 int age占用4个字节,默认是8个字节,但是就低不就高,所以取4字节申请,到了name是一个数组,按照数组基本类型是char类型,占用一个字节,取内存类型整数倍数开始,下标4开始申请20个字节,这时候下标为23.第三个double类型是8字节,所以从24开始,是8的整数倍,符合条件,申请8个字节空间,这时候下标为31,结合前面的字节数字为32个字节,比较三个成员数据申请空间大小,8最大,所以32为8的整数倍数,所以最终struct Stu类型的内存申请空间大小为32位.请看图:属于结构类型对齐方式:
在这里插入图片描述
在这里插入图片描述
自定义结构体对齐方式可以使用宏定义#pragram pack(1)来定义
拓展知识:结构类型之位段:
位段是节省内存空间,但是不能跨平台,数据类型的长度也不一样.还有储存的数据到底是从左储存还是从右边储存,都要值得思考,注意点,位域的类型必须是整数类型(有符号和无符号),char类型,有一点就是int类型不能确定是否是有符号和无符号.
在这里插入图片描述
这里先申请一个字节空间,age先用了2个bit,然后k在用3个bit等于多了3个bit,这时候higth要用8个bit不够用,重新申请了一个字节空间,从右边储存如图.所以得出结论 12 07…
结构体类型传参:
一个函数可以接受结构体类型参数,可以接受结构体指针参数,如果是结构体类型就要使用操作符.来获取结构体的成员,如果是接受了结构体指针的话,就要用操作符->来指向结构体的成员.函数在调用的时候,会在栈区开辟空间,如果传入结构体类型的参数话,会申请结构体占空申请空间大小,相当于临时拷贝,空间小还好,如果空间大,是容易导致内存泄漏,浪费资源,所以我们最好采用结构体指针来传参,对于结构体指针,X86情况下,是4个字节地址空间大小,而且在指针前面加上const,有着安全性的访问.

鹏哥之枚举类型讲解

枚举类型,是对一系列可以估算的值,经常用到的值进行打包.和#define有点类似,只不过#define是只能一个个的去定义,枚举可以批量定义.也是一种构造类型

#include<stdio.h>
	enum Color
	{
		RED,
		YELLOW,
		BLUE
	};
	int main()
	{
		enum Color colo=RED;
		printf("%d",colo);
		return 0;
	}

从代码来看,默认是0开始,但是我们可以在枚举里改下数字

#include<stdio.h>
	enum Color
	{
		RED,
		YELLOW=99,
		BLUE
	};
	int main()
	{
		enum Color colo=BLUE;
		printf("%d",colo);
		return 0;
	}

这时候colo的值为100;

鹏哥之联合类型讲解

什么是联合体?按照小编自己的想法,也是小白想法就是

联合体是共用一块内存空间,联合体内部一些成员空间,按照最大的那个成员类型定义好空间大小.
用个恰当比喻是,我有4个角色,第一个角色我是警察,第二个角色我是父亲,第三个角色我是儿子,第四个角色我是丈夫
在家我就是丈夫,在爸爸面前我就是儿子,在儿子面前我就是父亲,在外面我就是警察的意思.语法为,也就是说只用被一种使用.

#include<stdio.h>
union gs
{
	int a;
	char b;
};
int main()
{
	union gs dd;
	dd.a = 1;
	if (dd.b == 1)
	{
		printf("这个是小端模式\n");
	}
	else
	{
		printf("这个是大端模式\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值