C语言—结构体总结-创新互联
结构体
1 结构体类型的设计
分享文章:C语言—结构体总结-创新互联
本文路径:http://hbruida.cn/article/cchpcc.html
在C语言中,结构体是一种数据类型(由程序开发者自己设计的类型)。可以使用结构体来存放一组不同类型的数据。结构体的定义形式为:
怀仁ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作! struct 结构体名{ 成员列表;(基本数据类型;指针;数组或其他结构类型)
};
2 结构体变量的初始化结构体是一种数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间。
结构体变量初始化#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;
}
3 结构体成员访问#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
}
4 结构体大小
如何计算结构体的大小?- 结构体变量的首地址,必须是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://hbruida.cn/article/cchpcc.html