结构体
声明定义
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// struct 结构体名
// {
// 姓名
// 年龄
// 成绩
// }
struct student
{
char name[21]; // 10 个字 + \0
int age;
int score;
char addr[51];
};
// 第三种赋值
struct student1
{
char name[21]; // 10 个字 + \0
int age;
int score;
char addr[51];
}stu2 = {"张三", 18, 80, "湖南"};
int main()
{
// 创建结构体变量
struct student stu;
// 赋值1
// stu.name = "张三"; // 数组不能直接赋值
strcpy(stu.name, "张三");
stu.age = 18;
stu.score = 80;
// stu.addr = "湖南";
strcpy(stu.addr, "湖南");
// 赋值2
struct student stu1 = {"张三", 18, 80, "湖南"};
return 0;
}
scanf 输入
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char name[21]; // 10 个字 + \0
int age;
int score;
char addr[51];
};
int main()
{
struct student stu;
scanf("%s %d %d %s", stu.name, &stu.age, &stu.score, stu.addr);
return 0;
}
结构体数组
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char name[21]; // 10 个字 + \0
int age;
int score;
char addr[51];
};
int main()
{
struct student stu[3] = {
{"张三", 12 ,45, "北京"},
{"李四", 23, 44, "上海"}
};
printf("%s\n", stu[0].name);
printf("结构体数组大小:%d \n", sizeof(stu));
printf("结构体元素大小:%d \n", sizeof(stu[0]));
printf("结构体元素个数:%d \n", sizeof(stu) / sizeof(stu[0]));
return 0;
}
堆空间指针开辟结构体
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// ss 别名
typedef struct student ss;
struct student
{
char name[21]; // 10 个字 + \0
int age;
int score;
char addr[51];
};
int main()
{
// 开辟结构体指针
ss * p = (ss *)malloc(sizeof(ss) * 3);
p[0].age = 12;
printf("%d\n", sizeof(ss));
printf("%d\n", sizeof(p));
free(p);
return 0;
}
结构体嵌套
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
struct 技能 {
名称
等级
伤害
冷却
耗蓝
}
struct 人物信息info {
等级
经验
金钱
力量
敏姐
血量
蓝量
struct 技能 skills[4]
}
*/
struct kill
{
char name[21];
int lv;
};
struct info
{
char name[11];
int hp;
struct kill kills[2];
};
int main()
{
struct info userinfo;
strcpy(userinfo.name, "张三");
userinfo.hp = 12;
userinfo.kills[1].lv = 133;
return 0;
}
结构体赋值
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct info
{
char name[11];
int hp;
};
int main()
{
struct info userinfo = { "张三", 23};
struct info stu = userinfo; // 相当于 int a = 10; int b = a;
strcpy(stu.name, "李四");
printf("%s\n", userinfo.name); // 张三
return 0;
}
结构体指针类型
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct info
{
char *name;
int *hp;
};
int main()
{
struct info userinfo;
// 直接赋值 "张三" 本身是不能修改的常量,name = 野指针
// userinfo.name = "张三";
// printf("%s\n", userinfo.name);
// strcpy(userinfo.name, "李四"); // 修改不成功
// printf("%s\n", userinfo.name);
userinfo.name = (char *)malloc(sizeof(char) * 21);
strcpy(userinfo.name, "李四");
printf("%s", userinfo.name);
free(userinfo.name);
return 0;
}
结构体指针成员
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct info
{
char *name;
int *hp;
};
int main()
{
struct info userinfo = {"李四"};
struct info * p = &userinfo;
(*p).name = "nn";
// 结构体变量使用 .成员
printf("%s", userinfo.name);
// 结构体指针可以使用 -> 指向成员
printf("%s", p->name);
return 0;
}