结构体
自定义的数据类型;
由一批数据组合而成的结构型数据;
里面的每一个数据都是结构体“成员”
include <string.h>
struct GirlFriend { // 定义结构体
char name[100];
int age;
char gender;
double height;
};
int main() {
struct GirlFriend gf1; // 使用结构体
struct GirlFriend gf2 = {"小红", 22, "F", 1.92};
struct GirlFriend gf3 = {"小白", 12, "F", 0.92};
strcpy(gf1.name, "小丽"); // 字符串赋值
gf1.age = 18;
gf1.gender = 'F';
gf1.height = 1.90;
struct GirlFriend gfArr[3] = {gf1, gf2, gf3};
for(int i=0; i<3; i++) {
struct GirlFriend temp = gfArr[i];
printf("name:%s, age:%d", temp.name, temp.age);
}
}
结构体 起别名: typedef
typedef struct GirlFriend {
char name[100];
int age;
} GF;
// 使用的时候,不要在用struct声明, 直接使用
GF gf1;
GF arr[3] = {gf1, gf2, gf3}; // 别名使用在数组中。
结构体作为函数的参数
函数中可以传递结构体
两种情况:
- 传递结构体中的数据值;
- 传递结构体的地址值;
S stu;
strcpy(stu.name, "abc");
stu.age = 90;
method(stu); // 调用函数,给函数传递结构体。
// 传递结构体 S, 直接传递。修改后,不会影响调用处的值。
void method(S st) {
// 修改信息前的打印。
scanf("%s", st.name); // 输入姓名
scanf("%d", &(st.age)); // 输入年龄
// 修改后的信息打印
}
// 细节:函数中写的是结构体类型的变量,相当于定义了一个新的变量
// 如果要在函数中修改stu的值,此时就不要重新定义变量。直接接收stu的内存地址。
// p指针,记录的是main函数中stu的内存地址。
void method2(S* p) {
printf("接收main初始数据:%s, %d\n", (p).name, (p).age);
scanf("%s", (p).name); // 输入姓名
scanf("%d", &((p).age)); // 输入年龄
printf("method函数修改之后的:%s, %d\n", (p).name, (p).age);
}
method2(&stu); // 传递stu的地址。
结构体嵌套
struct Message {
char phone[12];
char email[100];
};
struct Student {
char name[100];
char gender;
double height;
struct Message msg;
};
struct Student stu;
strcpy(stu.name, "Tom");
stu.age = 20;
stu.gender = "F";
stu.height = 1.90;
strcpy(stu.msg.phone, "10086");
strcpy(stu.msg.email, "123@qq.com");
// 值的访问
printf("phone:%s, email:%s\n", stu.msg.phone, stu.msg.email);
// 批量进行赋值
struct Student stu2= {"lisi", 22, "F", 1.88, {"10010","5678@qq.com"}};
结构体:
内存对齐:
确定变量位置:只能放在自己类型 整数倍 的内存地址上。
struct Num {
double a; //8
char b; //1 (空白3字节)
int c; //4
char d; //1 (空白补7个字节)
}; // 总占用:8+4+4+8 = 24Byte。
最后一个部位:结构体的总大小,是最大类型的整数倍。8*N
心得:小的数据写在上面,大的数据写在下面,以节约内存空间。
网友评论