结构体
定义与遍历
格式:
struct 变量名
{
类型 变量名;
};
#include<stdio.h>
struct Student
{
char name[100];
int age;
};
int main()
{
//定义三个学生,同时进行赋值
struct Student stu1 = { "zhang",19 };
struct Student stu2 = { "wang",20 };
struct Student stu3 = { "zheng",18 };
//存入数组中
struct Student stuArr3[3] = { stu1,stu2,stu3 };
//遍历数组得到每一个元素
for (int i = 0; i < 3; i++)
{
struct Student temp = stuArr3[i];
printf("name:%s, age:%d\n", temp.name, temp.age);
}
return 0;
}
结果:
name:zhang, age:19
name:wang, age:20
name:zheng, age:18
别名
#include<stdio.h>
typedef struct
{
//别名
char name[100];
int age;
}m;
int main()
{
//别名:定义两个学生,同时进行赋值
m aaa = { "one",10 };
m b = { "two",12 };
//存入数组中
m stuArr3[2] = { aaa, b};
//遍历数组得到每一个元素
for (int i = 0; i < 2; i++)
{
m temp = stuArr3[i];
printf("name:%s, age:%d\n", temp.name, temp.age);
}
return 0;
}
结构体作为函数参数
#include<stdio.h>
#include<string.h>
typedef struct Student
{
//别名
char name[100];
int age;
}m;
void method(m st);
void method2(m* p);
int main()
{
//定义一个学生
m stu;
//赋值
strcpy(stu.name, "aaa");
stu.age = 0;
//输出
printf("初始数据:%s,%d\n", stu.name, stu.age);//aaa,0
//
method(stu);
printf("method修改后数据:%s,%d\n", stu.name, stu.age);//aaa,0
method2(&stu);
printf("method2修改后数据:%s,%d\n", stu.name, stu.age);//aaa,0
//细节:
// 如果函数中写的是结构体类型的变量,相当于定义一个新的变量
//此时把main函数中stu中的数据,传递给了method函数,并把stu中的数据赋值给新的变量st
//我们在函数中,仅仅修改st中的值,对于main函数中的stu的值没有修改
//所以不定义新的变量而传递stu的地址
return 0;
}
void method(m st)
{
printf("main初始数据:%s,%d\n", st.name, st.age);//aaa,0
//修改
printf("请输入要修改的学生名字\n");
scanf("%s", st.name);
printf("请输入要的修改学生年龄\n");
scanf("%d", &(st.age));
printf("method修改数据:%s,%d\n", st.name, st.age);//输入的
}
void method2(m* p)
{
printf("main初始数据:%s,%d\n", (*p).name, (*p).age);//aaa,0
//修改
printf("请输入要修改的学生名字\n");
scanf("%s", (*p).name);
printf("请输入要的修改学生年龄\n");
scanf("%d", &((*p).age));
printf("method2修改数据:%s,%d\n", (*p).name, (*p).age);
}
初始数据:aaa,0
main初始数据:aaa,0
请输入要修改的学生名字
asdf
请输入要的修改学生年龄
12
method修改数据:asdf,12
method修改后数据:aaa,0
main初始数据:aaa,0
请输入要修改的学生名字
asdf
请输入要的修改学生年龄
32
method2修改数据:asdf,32
method2修改后数据:asdf,32
结构体嵌套
#include<stdio.h>
#include<string.h>
struct message
{
char phone[12];
char mail[100];
};
struct Student
{
char name[100];
int age;
char gender;
double height;
struct message msg;
};
int main()
{
//
struct Student stu;
strcpy(stu.name, "zhang");
stu.age = 21;
stu.gender = 'M';
stu.height = 1.81;
strcpy(stu.msg.phone, "12312412424");
strcpy(stu.msg.mail, "12333245@qq.com");
//批量赋值
struct Student stu2 = { "li",32,'F',1.65,{"12132435424","33245@qq.com"} };
printf("信息:\n");
printf("name:%s\n", stu.name);
printf("age:%d\n", stu.age);
printf("gender:%c\n", stu.gender);
printf("height:%.2lf\n", stu.height);
printf("phone:%s\n", stu.msg.phone);
printf("mail:%s\n", stu.msg.mail);
printf("2信息:\n");
printf("name:%s\n", stu2.name);
printf("age:%d\n", stu2.age);
printf("gender:%c\n", stu2.gender);
printf("height:%.2lf\n", stu2.height);
printf("phone:%s\n", stu2.msg.phone);
printf("mail:%s\n", stu2.msg.mail);
return 0;
}
结果:
信息:
name:zhang
age:21
gender:M
height:1.81
phone:12312412424
mail:12333245@qq.com
2信息:
name:li
age:32
gender:F
height:1.65
phone:12132435424
mail:33245@qq.com
结构体内存对齐
内存对齐:
不管是结构体,还是普通的变量都存在内存对齐
规则:
只能放在自己类型整数倍的内存地址上简单理解:
内存地址/占用字节=结果可以整除
举例;
int存放的位置:内存地址—定能被4整除
long long存放的位置:内存地址—定能被8整除;double存放的位置:内存地址—定能被8整除
结构体的内存对齐:
结构体在上面的基础上又多了一条,结构体的总大小,是最大类型的整数倍(用来确定最后一个数据补位的情况)
切记! !
对齐的时候会补空白字节,但是不会改变原本字节的大小char补位之后,本身还是1个字节
心得:
我们会把小的数据类型,写在最上面,大的数据类型,写在最下面(节约空间)