当前位置 : 主页 > 编程语言 > c语言 >

自定义数据类型-结构体

来源:互联网 收集:自由互联 发布时间:2023-09-07
#define _CRT_SECURE_NO_WARNINGS 1 自定义类型:结构体、枚举、联合体 #pragma pack(8)//设置默认对齐数(可以减小减小浪费空间)struct stu//struct结构体类型,str结构体标签struct //没有stu叫匿名结构

#define _CRT_SECURE_NO_WARNINGS 1

自定义类型:结构体、枚举、联合体

#pragma pack(8)//设置默认对齐数(可以减小减小浪费空间) struct stu//struct结构体类型,str结构体标签 struct //没有stu叫匿名结构体类型

struct

{ int a; char c; }sa;//这样写结构体变量也可以使用

int main() {

//struct
//{
//	int a;
//	char c;
//}; sa;

//struct
//{
//	int a;
//	char c;
//}; *psa;

//int main()
//{
//	psa = &sa;//结构体成员变量相同,但类型标签不同时,系统默认内容不同,所以不能运行
//}//编译器会把上面的俩个声明当成完全不同的两个类型,所以是非法的

//struct Node
//{
//	int data;//4字节  数据域
//	struct Node* next;//4/8字节  指针域
//};

//结构体的自引用;
//	struct Node
//{
//	int data;
//	struct Node next;
//};
//正确的自引用方式;
//	struct Node
//{
//	int data;
//	struct Node* next;//可以放地址
//};

//typedef struct Node//这里的node不能去,否则下面的指针不能用
//{
//	int data;//4
//	struct Node *next;
//} Node;//类型名,不是变量名

//struct Node n1;

//结构体初始化和定义
//	struct S
//{
//	char c;
//	int a;
//	double d;
//	char arr[20];
//};
//int main()
//{
	//struct S s = { 'c',100,3.14,"hello bit" };
	//printf("%c %d %lf %s\n", s.c, s.a, s.d, s.arr);
//}

//struct T
//{
//	double weight;
//	short age;
//};

//struct S
//{
//	char c;
//	struct T st;//结构体里面放结构体
//	int a;
//	double d;
//	char arr[20];
//};

//int main()
//{
//	struct S s = { 'c',{55.6,30}, 100,3.14,"hello bit" }
//}

//结构体内存对齐
//	struct s1
//{
//	char c1;
//	int a;
//	char c2;
//};

//struct s1
//{
//	char c1;
//	int a;
//	char c2;
//};

//int main()
//{
//1.第一个成员在与结构体变量偏移量为0的地址处;
//	2.其它成员变量要对齐到某个数字(对齐数)的整数倍的地址处
//	对齐数=编译器默认的一个对齐数与该成员大小的较小值//对齐数默认是8
//	3结构体总大小为最大对齐数(每个成员变量都有1个对齐数)的整数倍
//	4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己最大对齐数的整数倍处,结构体的整体大小
//	就是所有最大对齐数与该成员大小的较小值。
//	struct S1 s1 = { 0 };
//	printf("%d\n", sizeof(s1));//12
//	struct S2 s2 = { 0 };
//	printf("%d\n", sizeof(s1));//8//结构体计算大小规则
//}

//struct s3; //{ // double d; // char c; // int i; //}//16 // //struct s4;//32 //{ // char c1; // struct S3 s3;//自己的最大对齐数为8,所以对齐到16开始放(浪费7个后,开始放) // double d;//从24开始放,不浪费 //}//32

//为什么存在内存对齐 //1.某些硬件平台只能在某些特定地址取某些特定类型的数据 //2.性能原因 //总结 是拿空间换时间的做法 // //printf("%d\n", offsetof(struct s, c));//offsetof 可以计算出偏移量的大小 //这里的offsetof是一个宏,不是函数

//void Init(struct S tmp)//传值不能改变原函数内容 //{ // tmp.a = 100; // tmp.c = 'w'; // tmp.d = 3.14; //} // //void Init(struct S *ps)//传地址能改变原函数内容 //{ // tmp.a = 100; // tmp.c = 'w'; // tmp.d = 3.14; //} // //void print1(struct S tmp)//只能打印 //{ // printf("%d %c %lf\n", tmp.a, tmp.c, tmp.d); //} // //void print1(struct S *ps)//可以打印,也可以改变 //{ // printf("%d %c %lf\n", ps.a, ps.c, ps.d); //} // //struct S s{0}; //Init(s); //Init(&s); //print1(s); //print2(&s);

return 0;

}

上一篇:结构体-位段
下一篇:没有了
网友评论