一、C语言构造类型
构造数据类型:根据已定义一个或多个数据类型用构造的方法来定义的。
一个构造类型可以分解成若干个“成员”,每个成员都是一个基本数据类型或又是一个构造类型
例如:数组类型、结构体类型、共用体(联合)类型
二、结构体定义
结构是一种构造类型,由若干“成员”组成,每个成员可以是一个基本数据类型或者又
是一个构造类型。
三、定义结构体的方法
struct 结构名
{
成员列表
};//此分号不能省
struct stu
{
int num;
char name[20];
char sex;
float score;
};
1)先定义结构体,然后在定义结构体变量
struct Student
{
int num;
char name[20];
char sex;
float score;
};
//注意:
1)结构体定义完成以后,计算机并不会给结构体分配内存空间
2)会在定义结构体变量后,分配存储空间
//结构体 变量定义格式;
struct 结构体名 结构体变量名;
struct Student stu1,stu2,stu3;//表示定义一个Student结构体类型的变量,变量名称stu1;
2)定义结构体的同时,定义结构体变量
格式:
struct Student
{
int num;
char name[20];
char sex;
float score;
}stu5,stu6,stu7;//也是用Student结构体定义三个结构体变量
3)使用匿名结构体定义结构体变量
struct {
char *color;
int speed;
}car1,car2,ca3;
四、结构体成员的访问方法。
结构变量名.成员名。
stu1.sex='f';
五、结构体变量初始化
1.先声明一个结构体,在初始化。
struct Student stu1;
strcpy(stu1.name,"周星驰");
stu1.name占用20个字节。(定义时是20字节)
stu1.name 的字符串长度 是9;
//汉字编码问题
//UTF-8 xcode默认的中文编码是UFT-8格式(国际通用编码)
//一个汉字占用三个字节
//GB2312 GBK 国标 一个汉字占用两个字节,
2.定义结构体变量的同时,进行初始化
struct Student stu2={99,"周润发",'f',59.99f};
3.定义结构体的公式,可以指定元素的初始化
struct Student stu3={.name="Lady Gaga"};
六、结构体大小计算方法和步骤
1)将结构体所以数据成员的长度值相加,记为 sum_a;
2)将各数据成员为了内存对齐,按各自对齐模数而填充的字节数累加到和sum_a上,
记为sum_b,对齐模数是#pragma pack 指定的数值以及该数据成员自身长度中数值较小者。
该数据相对起始位置应该是对齐模式的整数倍;
3)将和sum_b向结构体模数对齐,该模数是#pragma pack 指定的数值和
结构体内部最大的基本数据类型成员长度中数值较小者。结构体的长度是
该模数的整数倍。
#include <stdio.h>
int main() {
//计算结构体在内存中占用的字节数的方法
//1)先找对齐模数
//对齐模数 是结构体中基本数据类型中占用字节数最大的
//2)再计算结构体变量中 各个成员所占用的字节
struct A
{
//模数是8
<span style="white-space:pre"> </span>char ch[13];
<span style="white-space:pre"> </span>char ch1[11];
<span style="white-space:pre"> </span>int a;
};
struct A a1;
printf("%ld\n",sizeof(a1));
return 0;
}
七、结构体作用域
1.作用域概述
结构体定义在函数内部则结构体与局部变量作用域相同。
定义在函数外部,就是全局变量。
八、结构体数组
1.概念
结构数组的每一个元素都是具有相同结构类型的下标结构变量。
2.结构数组定义
struct 结构名{
成员列表
}数组名[数组长度];
//1.定义结构体数组的时候,进行初始化
struct stu{
char *name;
int age;
//float score;
}boy[3]={{"ab",18},{"bc",20},{"zzz",28}};
//定义了一个结构体数组boy,有5个元素,每个元素都具有 struct stu的结构。
//2.定义的同时进行初始化
struct stu girls[2]={{"bc",20},{"zzz",28}};
//3.先定义后初始化,整体赋值
struct stu ds[2];
ds[0]=(struct stu){"xzmly",18};
ds[1]=(struct stu){"xfdf",88};
//4.先定义结构体数组,后初始化
struct stu stu2[2];
//strcpy("stu[0].name","zhangsan");
scanf("%s",stu2[0].name);
九、结构数组的遍历
for(int i=0;i<3;i++)
{
printf("name :%s,age:%d\n",boy[i].name,boy[i],age);
}
十、结构体指针的定义和初始化
1.结构体指针变量指向结构体变量的首地址
格式:
struct 结构名 *结构体指针变量名
struct stu *p=NULL;
p=&boy[0];
2.结构体指针间接访问变量
(*结构体指针变量).成员名;
或者:
结构体指针变量->成员名;
printf("name:%s,age:%d\n",(*p).name,(*p).age);
printf("name:%s,age:%d\n",p->name,p->age);
3.结构体嵌套(结构体定义里面含有其他结构体)
1)结构体成员可以是另外一个结构体,
2)结构体不可以嵌套自己变量,可以嵌套指向自己这种类型的指针
struct Data
{
char *year;
char *month;
char *day;
};
struct student
{
int num;
char *name;
char sex;
struct Data birthday;
float socre;
};
4.结构体成员作为函数参数
#include <stdio.h>
struct Car
{
int lunzi;
int speed;
};
void xiuche1(struct Car c1)
{
c1.lunzi=2;
}
void xiuche(int n)
{
n=2;
}
void xiuche2(struct Car *c1)
{
(*c1).lunzi=2;
//c1->lunzi=2;
}
int main() {
struct Car car1={4,200};
//1.用结构体变量成员的作为函数参数,还是值传递
//xiuche1(car1);
xiuche2(&car1);
//注意:用结构体变量的地址传递给函数
// 也就是用结构体指针作为函数的参数
printf("%d\n",car1.lunzi);
return 0;
}
本文深入探讨了C语言中的构造类型,包括数组、结构体和共用体(联合)。详细解释了结构体的定义方法、成员访问、初始化、作用域、数组和指针的使用。此外,还介绍了结构体在内存中的存储方式和结构体大小的计算方法,以及如何遍历结构体数组。最后,阐述了结构体指针的定义、初始化和结构体嵌套的高级用法。

5288

被折叠的 条评论
为什么被折叠?



