C语言—结构体总结-创新互联
                                            
                                                结构体 
1 结构体类型的设计
网站栏目:C语言—结构体总结-创新互联
网址分享:http://www.cqwzjz.cn/article/cchpcc.html
                                            
                                        在C语言中,结构体是一种数据类型(由程序开发者自己设计的类型)。可以使用结构体来存放一组不同类型的数据。结构体的定义形式为:

  struct 结构体名{ 成员列表;(基本数据类型;指针;数组或其他结构类型)
      };结构体是一种数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间。
结构体变量初始化#includetypedef struct Student {//typedef 类型的重名名,将结构体Student重命名为stu
	int id;
	const char* name; //节省内存
	char sex[4];
	int age;
}stu;
int main() {stu st1 = {10010,"张三","男",19 };
	printf("%s\n", st1.name);  //张三
}
 #includestruct Date {int year;
	int month;
	int day;
};
struct Student {int id;
	const char* name; //节省内存
	char sex[4];
	int age;
	Date birth;
};
int main() {Student stu1 = {10010,"丽丽","女",19,2000,10,1 };
	Student stu2 = {10011,"思思","女",18,{1999,12,1} };
	Date date;
	return 0;
} #define  _CRT_SECURE_NO_WARNINGS
#include#includetypedef struct Student {int id;
	char name[10]; //节省内存
	char sex[4];
	int age;
}stu;
int main() {stu st1 = {10010,"张三","男",19 };
	stu* st2 = &st1; //定义一个结构体指针变量st2.
	//strcpy((*st2).name, "lisi");//方式1:(*结构体类型指针).成员名
	//strcpy(st2->name, "lisi");//方式2:结构体类型指针->成员名
	strcpy(st1.name, "lisi");//方式3:结构体变量.成员名
	
	//printf("%s\n", (*st2).name);//方式1  lisi
	//printf("%s\n", st2->name);//方式2  lisi
	printf("%s\n", st1.name); //方式3  lisi
}
  - 结构体变量的首地址,必须是MIN { 结构体大基本数据类型成员所占字节数,指定对其方式 } 的整数倍。
- 结构体每个成员对于结构体首地址的偏移量,必须是MIN { 基本数据类型成员,指定对齐方式 } 的整数倍。
- 结构体的总大小,必须是 { 大基本数据类型成员所占字节数(将嵌套结构体里的基本类型也算上,得出大基本数据类型成员所占字节数),指定对齐方式 } 的整数倍。
示例一
#includeint main() {struct A {int a;//4
		char b;//2 (前面4是2的倍数,不需要再加)  +2
		double c;//8 (前面的4+2=6不是8的倍数,需要再加上2)
		short d;//2 (前面4+2+2+8=16是2的倍数)   +2
		int e;//4 (前面16+2=18不是4的倍数,需要再加上2)
	};
	printf("%d\n", sizeof(A));//4+2+2+8+2+2+4=24
		
} 注意:VS默认对齐数为8。24恰好=MIN { 8(大基本数据类型成员所占字节数),8(对齐方式)} 的整数倍。
示例二
#includeint main() {struct A {int a;//4
		char b;//1 (4是1的倍数,不需要再加)
	};
	//4+1=5
	//最接近5
	//并且是MIN { 4(大基本数据类型成员所占字节数),8(对齐方式)} 的整数倍的数为8。
	struct B {char c;//1   +1
		short d;//2  (前面1不是2的倍数,所以再加1)
		A a;//8  (A不是基本数据类型,不需要和前面比较)
		int f;//4  (前面的1+1+2+8=12是4的倍数)
	};
	//1+1+2+8+4=16
	//16是MIN { 4,8 } 的整数倍
	//注意:大基本数据类型成员所占字节数(将嵌套结构体里的基本类型也算上)为4
	
	printf("%d\n", sizeof(A));//8
	printf("%d\n", sizeof(B));//16
	
} 注意:在嵌套结构体中,大基本数据类型成员所占字节数,要将嵌套结构体里的基本类型也算上.
示例三
#includeint main() {struct A {char name[10];//10  +2
		int a;//4 
		char* sex;//X64:8字节   X86:4字节   
	};
	//10+2+4+8=24  10+2+4+4=20 
	//24恰是MIN { 8,8 }的整数倍
	//20恰是MIN { 4, 8 }的整数倍
		printf("%d\n", sizeof(A));//24或者20
		
} 4-2 指定对齐值这里的结果可能是20或24。是因为char* sex;指针的大小和平台有关系,在X64系统中为8字节,在X86系统中为4字节。
预处理指令#pragma pack(n)可以改变默认对齐数。n取值可以是1,2,4,8,16,……
示例一
#include#pragma pack(4)
struct A {double a;//8
	int b;//4 
};
#pragma pack()
//8+4=12 是MIN { 8,4 }的整数倍
int main() {printf("%d\n", sizeof(A));//12
} 示例二
#include#pragma pack(2)
struct A {char a;//1 +1
	int b;//4  
};
#pragma pack()
//1+1+4=6 是MIN { 4(大基本数据类型成员所占字节数),2(对齐方式) }的整数倍
#pragma pack(4)
struct B {int i;//4
	char c;//1  
	A a;//6  +1
	int d;//4 (4+1+6=11不是MIN{4,4}的倍数,需要再加1)
};
#pragma pack()
//4+1+6+1+4=16 是MIN { 4,4 }的整数倍
int main() {printf("%d\n", sizeof(A));//6
	printf("%d\n", sizeof(B));//16
}
 示例三
#include#pragma pack(4)
struct A {char a; //1  +3
	double b;//8
	int c;//4 
	short d;//2	
};
#pragma pack()
//1+3+8+4+2=18   最接近MIN{8,4}的整数倍   20    
#pragma pack(4)
struct B {int e;//4
	char f;//1
	A a;//20  +3 
	double g;//8
};
#pragma pack()
//4+1+20+3+8=36 最接近MIN{8,4}的整数倍  36
int main() {printf("%d\n", sizeof(A));//20
	printf("%d\n", sizeof(B));//36
}
 你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站栏目:C语言—结构体总结-创新互联
网址分享:http://www.cqwzjz.cn/article/cchpcc.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 