结构体是一种构造数据类型,把不同的数据类型整合起来称为一个自定义的数据类型
结构体的写法
基本写法,设置别名,匿名结构体,嵌套结构体
// 基本使用
struct Man {
char name[20];
int age;
};
// 结构体设置别名,可以直接使用别名(变量名),也可以直接进行初始化
struct Man1 {
char name[20];
int age;
} man1, man11 = {"张三", 20}; //man11 直接赋值
// 匿名结构体
struct {
char name[20];
int age;
} man2;
struct Teacher {
char name[20];
};
// 结构体嵌套
struct Student {
char name[20];
struct Teacher t;
};
struct StudentSup {
char name[20];
struct TeacherSup {
char name[20];
} tSup;
};
int main() {
//基本使用 直接赋值 在栈中定义过了
struct Man man = {"Man", 20};
// 声明变量,根据属性赋值
struct Man man_;
strcpy(man_.name, "copyMan");
man_.age = 21;
printf("man的赋值 name=%s age=%d\n", man.name, man.age);
printf("man_变量的赋值 name=%s age=%d\n", man_.name, man_.age);
strcpy(man1.name, "我是别名man1");
man1.age = 22;
printf("man1 别名的赋值 name=%s age=%d\n", man1.name, man1.age);
printf("man1 别名初始化的赋值 name=%s age=%d\n", man11.name, man11.age);
strcpy(man2.name, "我是匿名结构体");
man2.age = 23;
printf("匿名结构体的赋值 name=%s age=%d\n", man2.name, man2.age);
struct Student student = {"李四", {"王老师"}};
printf("嵌套结构体 老师=%s 学生=%s\n", student.t.name, student.name);
struct Student student1;
strcpy(student1.name, "变量赋值");
strcpy(student1.t.name, "老师变量赋值");
printf("嵌套结构体 变量赋值 老师=%s 学生=%s\n", student1.t.name, student1.name);
struct StudentSup studentSup;
strcpy(studentSup.name, "内部嵌套的学生");
strcpy(studentSup.tSup.name, "内部嵌套的老师");
printf("内部嵌套结构体 老师=%s 学生=%s\n", studentSup.tSup.name, studentSup.name);
}
man的赋值 name=Man age=20
man_变量的赋值 name=copyMan age=21
man1 别名的赋值 name=我是别名man1 age=22
man1 别名初始化的赋值 name=张三 age=20
匿名结构体的赋值 name=我是匿名结构体 age=23
嵌套结构体 老师=王老师 学生=李四
嵌套结构体 变量赋值 老师=老师变量赋值 学生=变量赋值
内部嵌套结构体 老师=内部嵌套的老师 学生=内部嵌套的学生
结构体指针
结构体指针 -> 是 *p 的简写
struct Man {
char name[20];
int age;
};
void main() {
struct Man man = {"张三", 20};
struct Man *p = &man;
// 结构体指针 -> 是 *p 的简写
printf("name=%s,age=%d\n",p->name,p->age);
printf("name=%s,age=%d\n",(*p).name,(*p).age);
printf("name=%s,age=%d\n",man.name,man.age);
}
结构体数组和指针
struct Man {
char name[20];
int age;
};
void main() {
struct Man mans[] = {{"张三", 20},
{"李四", 20}};
struct Man *p = mans;
for (; p < mans + 2; p++) {
printf("%s,%d\n", p->name, p->age);
}
//sizeof(mans) 是 结构体数组的大小
//sizeof(struct Man) 是结构体的大小
// 结构体的大小,必须是最大基本类型的整数倍
int i = 0;
for (; i < sizeof(mans) / sizeof(struct Man); i++) {
printf("%s,%d\n", mans[i].name, mans[i].age);
}
}
结构体的大小,必须是最大基本类型的整数倍
动态加载结构体
struct Man {
char name[20];
int age;
};
void main() {
struct Man *man = (struct Man *) malloc(sizeof(struct Man) * 10);
struct Man *p = man;
// p 指针 对man指针进行赋值
strcpy(p->name, "wx");
p->age = 18;
p++;
strcpy(p->name, "wx1");
p->age = 19;
// loop_p指针等于 man ,并对loop进行循环
struct Man *loop_p = man;
for (; loop_p < man + 2; loop_p++) {
printf("%s,%d\n", loop_p->name, loop_p->age);
}
// 动态加载要手动释放
free(man);
man = NULL;
}
typedef 类型取别名 书写简单 结构体名和别名一样,少些struct
typedef int Jint; // int类型别名
typedef int *pInt; // int指针类型 别名
typedef struct Man {
char name[20];
int age;
} W, *Wp; // w是结构体的别名 *wp是结构体的指针别名
void main() {
int i=10;
Jint jint = 15;
pInt p = &i;
W w = {"张三",20};
Wp wp = &w;
printf("int 指针别名 的值=%d\n",*p);
printf("man 指针%s,%d",wp->name,wp->age);
}
结构体函数指针
struct Man {
char name[20];
int age;
// 返回值 方法名 传递参数
void (*fun_name)(char *);
};
void fun(char *c) {
printf("c 的值%s\n", c);
}
void main() {
struct Man man;
strcpy(man.name, "我是结构体函数");
man.age = 20;
man.fun_name = fun;
man.fun_name("我是函数指针");
printf("name = %s", man.name);
}
c 的值我是函数指针
name = 我是结构体函数
结构体指针取别名
typedef struct Girl{
char *name;
int age;
//函数指针
void(*sayHi)(char*);
}Girl;
//Girl结构体指针取别名GirlP
typedef Girl* GirlP;
void sayHi(char* text){
MessageBoxA(0, text, "title", 0);
}
//改名
void rename(GirlP gp1){
gp1->name = "Lily";
}
void main(){
Girl g1 = { "Lucy", 18, sayHi };
GirlP gp1 = &g1;
gp1->sayHi("Byebye!");
//传递指针,改名
rename(gp1);
getchar();
}
网友评论