005:C结构体

2024-05-29  本文已影响0人  xqiiitan

结构体

自定义的数据类型;
由一批数据组合而成的结构型数据;
里面的每一个数据都是结构体“成员”

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

心得:小的数据写在上面,大的数据写在下面,以节约内存空间。

上一篇 下一篇

猜你喜欢

热点阅读