扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
目录
创新互联建站是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,微信小程序开发,十年建站对成都砂岩浮雕等多个行业,拥有丰富的网站设计经验。一、结构体的设计
二、结构体变量的初始化
2.1结构体在内存表示;
2.2结构体初始化;
2.3结构体指针变量
2.4结构体嵌套结构体
三、结构体成员访问
3.1、结构体成员访问
3.2、结构体变量和指针
3.3、结构体和函数
四、结构体与数组
五、计算结构体大小
三个规则:
例1、
例2、
指定对齐值
总结
C语言提供了基本的数据结构,例如 char 、short 、int 、float....等类型;这些偶称为内置类型。怎样设计出来属于自己的类型?
程序员可以使用结构体来封装一些属性,设计出新的类型,在C语言中称为结构体类型。
结构体的定义形式为
struct 结构体名
{
成员列表(可以是基本的数据类型,指针,数组或其他结构类型)
};
举个例子来说吧;
客观事务(实体)是复杂的,要描述它必须从多方面进行;也就是用不同的数据类型来描述不同的方面;用学生实体来说:
学生拥有什么? 学号、姓名、性别、年龄;
struct Student
{
char s_id[8];
char s_name[8];
char s_sex[4];
int s_age;
};
注意以下几点;
(1)、关键字struct是数据类型说明符,指出下面说的是结构体类型;
(2)、标识符Student是结构体的类型名;
(3)、最后的分号一定要写;
二、结构体变量的初始化结构体是一种数据类型,也就是说可以用它来定义变量。
结构体就像一个“模板”,定义出来的变量都具有相同的性质。可以将结构体比作“图纸”,结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的;
结构体是一种数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据、需要存储空间;
2.1结构体在内存表示;C语言中 struct 不可少
2.2结构体初始化;2.3结构体指针变量2.4结构体嵌套结构体三、结构体成员访问 3.1、结构体成员访问结构体变量使用 . 访问;
结构体变量.对象
#include#includestruct Date
{
int year;
int month;
int day;
};
struct Student
{
char s_name[20];
struct Date birthday;
float score;
};
int main()
{
struct Student stu = { "liuwen",2000,10,1,99.9 };
printf("name=%s\nbirtyday=%d.%d.%d\nscore=%f\n", stu.s_name, stu.birthday.year, stu.birthday.month, stu.birthday.day, stu.score);
stu.score = 77;
printf("name=%s\nbirtyday=%d.%d.%d\nscore=%f\n", stu.s_name, stu.birthday.year, stu.birthday.month, stu.birthday.day, stu.score);
return 0;
注意:对结构体变量整体赋值有三种情况
(1)定义结构体变量(用{}初始化)
(2)用已定义的结构体变量初始化
(3)结构体类型相同的变量可以作为整体相互赋值;
在C语言中不存在结构体类型的强制转换。
3.2、结构体变量和指针内置类型可以定义指针变量,结构体类型也可以定义结构体类型指针;
结构体类型指针访问成员的获取和赋值形式:
(1)(*p). 成员名(.的优先级高于*,(*p)两边括号不能少)
(2) p->成员名(->指向符)
示例:
#include#include//#define _CRT_SECURE_NO_WARNINGS
struct Inventory//商品
{
char description[20];//货物名
int quantity;//库存数据
};
int main()
{
struct Inventory sta = { "iphone",20 };
struct Inventory* stp = &sta;
char name[20] = { 0 };
int num = 0;
(*stp).quantity = 30;
stp->quantity = 30;
strcpy_s(name,sizeof(stp->description),stp->description);
printf("%s %d\n", stp->description, stp->quantity);
printf("%s %d\n", (*stp).description, (*stp).quantity);
return 0;
}
3.3、结构体和函数 示例:
#include#include#define _CRT_SECURE_NO_WARNINGS
struct School
{
char s_name[20];//学校
int s_age;
};
void Print_a(struct School sx)
{
printf("%s %d\n", sx.s_name, sx.s_age);
}
void Print_c(struct School* sp)
{
printf("%s %d\n", sp->s_name, sp->s_age);
}
int main()
{
struct School sx = { "xi'an",100 };
Print_a(sx);
Print_c(&sx);
return 0;
}
内存什么的看上面;
两种传参那个更好?通过内存可以看出来;
四、结构体与数组结构体数组,是指数组中的每一个元素都是一个结构体类型。在实际应用中,C语言结构体数组常被用来表示有相同的数据结构的群体,比如一个班的学生,一个公司的员工等;
例如:
#include#include#define _CRT_SECURE_NO_WARNINGS
struct Student
{
char s_name[20];//姓名
int age;//年龄
float score;//成绩
};
int main()
{
struct Student cla[] =
{
{"liuwen",18,149.9},
{"qnge",18,145},
{"anan",19,188},
};
return 0;
}
五、计算结构体大小
三个规则:(1)、结构体变量的首地址,必须是结构体变量的“大基本数据类型成员所占字节数”的整数倍;
(2)结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节数的整数倍;
(3)、结构体变量的总大小,为结构体变量中“大基本数据类型成员所占字节”的整数倍;
示例:假设总零地址开始(计算)
例1、struct node
{
char cha;
int ia;
char chb;
};
int main()
{
int size = 0;
struct node sd = { 'a',2,'b' };
printf("%d\n", sizeof(struct node));//12
return 0;
}
例2、struct node
{
char cha;
char chb;
int ia;
};
int main()
{
int size = 0;
struct node sd = { 'a','b',2 };
printf("%d\n", sizeof(struct node));//12
return 0;
}
为什么要理解字节对齐问题?
(1)内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问变量,但是实际上, cup并非逐字节读写内存,而是以2,4,或8的倍数的字节块来读写内存,因此就会对基本数据类型的地址作出一些限制, 即它的地址必须是2, 4或8的倍数。那么就要求各种数据类型按照一定的规则在空间. 上排列,这就是对齐。
(2)有些平台每次读都是从偶地址开始,如果一个int 型(假设为32位系统)如果存放在偶地址开始的地方那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多。
(3)由于不同平台对齐方式可能不同,如此一来,同样的结构在不同的平台其大小可能不同,在无意识的情况下,互相发送的数据可能出现错乱,甚至引|发严重的问题。
指定对齐值预处理指令# pragma pack(n)可以改变默认对齐数。n取值是1,2, 4,8, 16。
总结1)结构体变量的首地址,必须是MIN{"结构体大基本数据类型成员所占字节数",指定对齐方式}大小的整数倍。
2)结构体每个成员相对于结构体首地址的偏移量,都是MIN{基本数据类型成员,指定对齐方式}大小的整数倍。
3)结构体的总大小,为MIN{结构体“大基本数据类型成员所占字节数”(将嵌套结构体里的基本类型也算上,得出大基本数据类型成员所占字节数),指定对齐方式} 大小的整数倍。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流