【C语言】自定义结构体类型及内存分布

自定义结构体类型及内存分布

1、结构体:结构体是一些值得集合,这些值成为成员变量,成员的每个变量可以是不同的类型,例如标量,指针,数组,其他的结构体.
2、结构体定义,创建变量及初始化

struct Peo_data {

	char name[10];
	int age;
}data = {"zhangsan",5};
//struct Peo_data data = {"zhangsan",5};

struct为结构体的关键字,Peo_data,是我们为这个结构体起的名字。里面的成员包含一个数组,和一个整形变量。
在定义结构体时我们可以直接创建一个变量,也可以在使用的时候创建一个变量。相对应我们可以将它初始化
3、结构体变量访问
(1)结构体变量访问成员,使用点操作符进行访问(.)

struct Peo_data {

	char name[10];
	int age;
}data;
int main()
{
	//在内存中给变量data创建一块
	struct Peo_data data = {"zhangsan",5};
	//变量data有俩个成员,将它们分别打印
	printf("%s\n",data.name);
	printf("%d\n",data.age);
	return 0;
}

(2)结构体指针访问成员

//声明定义一个结构体类型
struct Next_Peo
{
	char name[10];
	int age;
};

//因为传过来的形式参数是一个struct Next_Peo结构体类型
//相对应实参要用一个结构体指针接收
void print(struct Next_Peo* p)
{
	//p是一个指针变量,指向data变量的地址,先对p进行解引用
	//p现在就可以访问data变量下的所有成员,再用“.”操作符一一访问
	//p是一个指针变量,指向data变量的地址,它也可以直接访问地址下的成员
	printf("%s\n",(*p).name);
	printf("%d\n",(*p).age);
	printf("%s\n",p->name);
	printf("%d\n",p->age);
}
int main()
{
	//创建变量
	struct Next_Peo data = {"zhangsan",5};
	//地址传参打印变量成员
	print(&data);
	return 0;
}

4、结构体在内存的分布
(1)了解结构体在内存的分布,我们先了解一个概念,编译器为结构的每一个成员按照它的自然边界分配空间,各个成员按照它们声明的顺序在内存中存储,第一个成员的地址也是整个结构的地址。
每个编译器会根据自己电脑设置自己的对齐数,在VS的编译器下对起数为4.为什么编译器在存储结构的时候要按照自然边界来分配空间呢?打个比方:我们的电脑是32位系统,一次访问内存的字节数位4字节,按照对齐数4来读取数据的话就能够更高效的操作。
下面展示一些 内联代码片

//声明定义一个结构体类型
struct Next_Peo
{
	char name[10];//10
	float a;//4
	int age;//4
};
int main()
{
	printf("%d\n",sizeof(struct Next_Peo));
	return 0;
}

该结构在内存中占字节大小20
声明定义结构体类型

在这里插入图片描述
红色代表数组name[10]最后字节地址偏移量为10,接下来a变量要存储的话按照编译器的对齐数来的话,要是4的倍数,就要舍去2个字节的内存存储a,a的最后偏移量为16,为对齐数的整数倍,可以接着存放age,age的最后的偏移量为20为对齐数的整数倍,所以该结构占内存20字节。
(2)

struct Peo_Info
{
	char name[10];
	int age;
	struct Peo_Info* next;
}data;
int main()
{
	printf("%d\n",sizeof(struct Peo_Info));
	return 0;
}

结果是20个字节。注意:结构体指针,存放一个地址要么4个字节或者8个字节。根据上面的分析进行计算

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值