c语言---结构体

 目录

1.结构体的定义及使用

2.c++可以用定义类型的方式定义

3.结构体类型不同,指针不能接收

4.结构体内部不可以定义自身类型的变量

5.但是结构体内部可以定义自身类型的指针

6.结构体的初始化

7.结构体内部嵌套结构体

8.⭐结构体内存对齐

字节对齐:减少访问次数,用空间换取时间

对齐方式:

4.自定义类型有效对齐值

9.练习1

10.练习2

11.练习3

12练习4

13.练习5


1.结构体的定义及使用

struct stu //stu若省略,则是匿名结构体,不能在外面定义结构体变量
{
	char name[20];
	int age;
	char sex[5];
	char id[20];

}t1,t2,*t3; //全局结构体变量, 结构体指针用来接收结构体变量的地址

void main()
{
	struct stu t;//定义结构体变量
	t.age = 19;

}

2.c++可以用定义类型的方式定义

typedef struct stu
{
	char ch;
	int age;
	double d;
}stu;

void main()
{
	stu s;//定义结构体变量可省略struct
}

3.结构体类型不同,指针不能接收

4.结构体内部不可以定义自身类型的变量

typedef struct stu
{
	char ch;
	int age;
	double d;
	struct stu t;//错的
}stu;

5.但是结构体内部可以定义自身类型的指针

原因是指针只开辟四或八个字节的空间

typedef struct stu
{
	char ch;
	int age;
	double d;
	struct stu *t;//OK
}stu;

6.结构体的初始化

typedef struct stu
{
	char ch;
	int age;
	double d;
}stu;

void main()
{
	struct stu t = { 'a', 100, 12.34 };
}

7.结构体内部嵌套结构体

typedef  struct Date
{
	int year;
	int month;
	int day;
}Date;

typedef  struct Time
{
	int hour;
	int minute;
	int second;
}Time;

typedef struct birthday
{
	Date dt;

	Time te;
}birthday;

void main()
{
	birthday t;
	t.dt.year = 2002;
}

8.⭐结构体内存对齐

字节对齐:减少访问次数,用空间换取时间

对齐方式:

1.了解每个类型自身的大小

2.自定义类型的自身对齐值(顺序不同,内存可能不同)(最好从小到大排列)

typedef struct stu
{
	//字节对齐
	char ch;//1+7
	double d;//8
	int age;//4+4
}stu;

void main()
{
	printf("%d\n", sizeof(stu));//24
}
typedef struct stu
{
	//字节对齐
	char ch;//1+3
	int age;//4
	double d;//8
}stu;

void main()
{
	printf("%d\n", sizeof(stu));//16
}

3.程序指定对齐值  #pragma pack(2)

#pragma pack(2)
typedef struct stu
{
	//字节对齐
	char ch;//1+1
	int age;//4
	double d;//8
}stu;

void main()
{
	printf("%d\n", sizeof(stu));//14
}

4.自定义类型有效对齐值

指定对齐值不能超过原本的内存;若有歧义,按照较小的对齐值运行

#pragma pack(8)
typedef struct stu
{
	//字节对齐
	char ch;//1+3
	int age;//4
	double d;//8
}stu;

void main()
{
	printf("%d\n", sizeof(stu));//16
}

9.练习1

typedef struct stu
{
	short a;//2+6
	struct//24
	{
		int o;//4+4
		double b;//8
		char s;//1 +7
	};
	int e;//4 +4
}stu;

void main()
{
	printf("%d\n", sizeof(stu));//40
}

10.练习2

typedef struct stu
{
	short a;//2+6
	struct//56
	{
		int o[10];//40
		double b;//8
		char s;//1 +7
	};
	int e;//4 +4
}stu;

void main()
{
	printf("%d\n", sizeof(stu));//72
}

11.练习3

#pragma pack(4)
typedef struct stu
{
	short a;//2+2
	struct//16
	{
		int o;//4
		double b;//8
		char s;//1+3
	};
	int e;//4
}stu;

void main()
{
	printf("%d\n", sizeof(stu));//24
}

12练习4

#pragma pack(8)
typedef struct stu
{
	int o;//4 + 4
	struct//16
	{
		double b;//8
		char s;//1+1
		short a;//2+4
	};
	char e;//1 +7
}stu;

void main()
{
	printf("%d\n", sizeof(stu));//32
}
#pragma pack(8)
typedef struct stu
{
	int o;//4
	struct t//0
	{
		double b;
		char s;
		short a;
	};
	char e;//1 + 3
}stu;

void main()
{
	printf("%d\n", sizeof(stu));//8
}

13.练习5

struct s1//16
{
	char c1;//1 +3
	int i;//4
	double d;//8
};

struct s2//8
{
	char c1;//1
	char c2;//1+2
	int i;//4
};

struct s3//16
{
	double d;//8
	char c;//1 + 3
	int i;//4
};

struct s4//32
{
	char c1;//1 + 7
	struct s3 s3;//16
	double d;//8
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值