C语言—结构体与共用体(联合体)

一、结构体
1.结构体的声明及定义:
(1)声明一个student的类型

struct  student
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
};
struct student std1;// 定义结构体变量std1

(2)用typedef 对结构体声明

typedef struct student
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
}student;
student std1;//定义结构体变量std1

2.结构体的初始化和成员访问
(1)结构体初始化

	struct student std1 = { "zhangsan", 20, "nan", "1758962312" };//初始化
	student std1 = { "zhangsan", 20, "nan", "1758962312" };//初始化

(2)结构体的成员访问

typedef struct student
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
}student;

int main()
{
	student std1 = { "zhangsan", 20, "nan", "1758962312" };//初始化
	printf("%s %d %s %s\n", std1.name, std1.age, std1.sex, std1.id);//结构体访问
	system("pause");
	return 0;
}

利用结构体指针访问成员变量:
定义结构体指针指向定义的std1,通过指针对结构体成员进行访问。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//struct  student
//{
//	char name[20];
//	int age;
//	char sex[5];
//	char id[20];
//};
typedef struct student
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
}student;

int main()
{
	student std1 = { "zhangsan", 20, "nan", "1758962312" };//初始化
	//printf("%s %d %s %s\n", std1.name, std1.age, std1.sex, std1.id);
	student* ps = &std1;
	printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->id);
	system("pause");
	return 0;
}

3.结构体内存对齐

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    VS中默认的值为8
    Linux中的默认值为4
  3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所 有最大对齐数(含嵌套结构体的对齐数)的整数倍。

二、共用体(联合体)
联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以 联合也叫共用体)
(1)联合体声明及定义

union Un
{
   char c; 
   int i;
}; 
//联合变量的定义 
union Un un;
//计算连个变量的大小 
printf("%d\n", sizeof(un)); 

从输出的大小可以看出各个成员共用一个内存空间
(2)联合体应用举例
判断当前机器的大小端问题:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

int check_sys()
{
	union
	{
		int i;
		char c;
	}u;
	u.i = 1;
	return u.c;
}
int main()
{
	if (check_sys() == 1)
		printf("小端\n");
	else
		printf("大端\n");
	system("pause");
	return 0;
}

(3)联合大小的计算
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
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));
	system("pause");
	return 0;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值