结构体,和 Java 中的 class 类似
1.创建结构体的两种方法
#include <stdio.h>
//struct - 结构体关键字,stu - 结构体标签, struct stu - 结构体类型
//定义一个结构体类型
struct stu {
//成员变量
char name[20];
short age;
char tel[12];
char sex[5];
}s1, s2, s3; //s1, s2, s3是三个全局的结构体变量
typedef struct dog {
//成员变量
char name[20];
short age;
char tel[12];
char sex[5];
} dog; //此处的 dog 为创建的类型
int main() {
struct stu s = {"sandy", 20, "15988886666", "男"}; //创建结构体变量,局部变量
dog d = {"dog", 2, "15988886666", "male"};
return 0;
}
2.结构体套娃
struct S {
int a;
char c;
char arr[20];
double d;
};
struct T {
char ch[10];
struct S s; //结构体中可以包含结构体
char *pc;
};
int main() {
char arr[] = "hello bit\n";
struct T t = {"hehe", {100, 'w', "hello world!", 3.14}, arr}; //嵌套结构体
printf("%s\n", t.ch); //hehe
printf("%s\n", t.s.arr); //hello world!
printf("%lf\n", t.s.d); //3.14
printf("%s\n", t.pc); //hello bit , %s 打印字符串,%p 打印指针地址
return 0;
}
hehe
hello world!
3.140000
hello bit
2.结构体成员的两种访问方式
2.1.传结构体访问成员变量时会在内存中复制一份临时变量,不推荐使用
例如 tmp.name
2.1.传指针访问成员变量时没有额外的操作
例如 ps->name ,也可以这样访问 (*ps).sex
typedef struct Stu {
//成员变量
char name[20];
short age;
char tel[12];
char sex[5];
}Stu;
void show(Stu tmp) {
printf("name: %s\n", tmp.name);
printf("age: %d\n", tmp.age);
printf("tel: %s\n", tmp.tel);
printf("sex: %s\n", tmp.sex);
}
void show2(Stu* ps) {
printf("name: %s\n", ps->name);
printf("age: %d\n", ps->age);
printf("tel: %s\n", ps->tel);
printf("sex: %s\n", ps->sex);
printf("sex: %s\n", (*ps).sex);
}
int main() {
Stu s = {"sandy", 20, "15951885960", "男"};
show(s); //传结构体
show2(&s); //传地址
return 0;
}