结构体 struct
使用关键字:struct
定义:用户自定义的数据类型,在结构体中可以包含若干不同数据类型的成员变量(也可以相同),使这些数据项组合起来反映某一个信息。
格式:
struct 结构体名
{
数据类型 成员变量名1;
数据类型 成员变量名2;
数据类型 成员变量名3;
....
};
结构体变量:
概念:使用结构体类型定义的变量的就是把结构体变量
格式:struct 结构体名 变量名;
定义方式:
1.定义结构体同时定义结构体变量
struct demo
{
char name[32];
int age;
float score;
}dem1;
2.定义完成结构体后在定义变量:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct demo
{
char name[32];
int age;
float score;
};
int main()
{
struct demo dem1;
return 0;
}
3.定义结构体时没有名称
struct
{
char name[32];
int age;
float score;
}d1;
赋值:
1.花括号按顺序赋值赋值
struct{
char name[32];
int age;
float score;
}d1={"hello",10,1.9};
2.通过点的方式分开赋值
struct demo
{
char name[32];
int age;
float score;
};
int main()
{
struct demo dem1;
dem1.age = 20;
dem1.score = 1.99;
}
3.通过大括号点等法赋值
struct demo
{
char name[32];
int age;
float score;
};
int main()
{
struct demo dem1 = {
.age = 22,
.name = "hello",
};
printf("age=%d name=%s\n",dem1.age,dem1.name);
访问:
输出:通过点的方式:结构体变量名.成员变量名
输入: 结构体变量名.成员变量名
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct demo
{
char name[32];
int age;
float score;
};
int main()
{
struct demo dem1 ;
scanf("%s",dem1.name);
printf("name=%s\n",dem1.name);
return 0;
}
重定义 typedef
语法:typedef 旧名称 新名称
typedef int size_t
typedef int* intp
int* p====intp p
1.定义结构体的同时重定义
typedef struct demo
{
char name[32];
int age;
float score;
}DM;
2.分开
typedef struct demo DM;
DM dem1;
结构体数组
概念:结构体类型相同的变量组成的数组
定义格式:
1.定义结构体同时定义结构体数组
struct demo
{
char name[32];
int age;
float score;
}Darr[3];
2.先定义结构体后定义结构体数组
struct demo Darr[3];
初始化:
1.定义同时赋值
struct demo
{
char name[32];
int age;
float score;
} arr[3] = {
{"a", 20, 19.9},
{"b", 23, 123.2},
{"ab", 49, 20.1}};
3.先定义后每一个元素赋值
struct demo Darr[3];
strcpy(Darr[0].name,"kk");
Darr[0].age=20;
Darr[0].score=120.8;
Darr[1].age=20;
结构体数组的大小:
- 结构体大小*元素的个数
- sizeof(结构体数组名称)
结构体大小:
字节对齐原则 ---- 对齐8字节 比8字节小按照8字节开辟空间
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct demo
{
short a;// 2 开辟8字节
int b; //4
double c;//8 开辟8字节
};
int main()
{
struct demo Darr[3];
printf("%d\n", sizeof(struct demo)); // 16
return 0;
}
循环的赋值
输入输出:
struct demo Darr[3];
for (int i = 0; i < 3; i++)
{
scanf("%hd%d%lf", &Darr[i].a, &Darr[i].b, &Darr[i].c);
}
for (int i = 0; i < 3; i++)
{
printf("%d %d %lf \n", Darr[i].a, Darr[i].b, Darr[i].c);
}
节省空间原则
减少空间浪费 ,尽可能的压缩
结构体指针
概念:指向结构体变量的指针
定义格式:
struct 结构体名 * 指针名;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct demo
{
short a; // 2 开辟8字节
int b; // 4
double c; // 8 开辟8字节
} d1, d2;
struct work
{
int a;
} w1;
int main()
{
struct demo *p = &d1;
struct demo *p1 = &w1;//错
return 0;
}
赋值:
1.指针变量名->成员变量名=新值
struct demo *p = &d1;
p->a=10;
p->b=20;
p->c=1.99;
printf("%hd\n",p->a);
2.(*p).成员变量
struct demo *p = &d1;
(*p).a = 1000;
printf("%hd\n", p->a);
大小:8字节
重定义指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct demo
{
short a; // 2 开辟8字节
int b; // 4
double c; // 8 开辟8字节
} D, *DP;
int main()
{
D d1;//struct demo d1
DP p = &d1;//struct demo *
(*p).a = 1000;
printf("%hd\n", p->a);
return 0;
}
总结:
1. 不能把结构体类型变量作为整体引用,只能对结构体类型变量中的各个成员变量分别引用
即:stu.id可以输出 直接输出stu不行 stu整体不行必须具体到每一个成员变量
2.如果成员变量本身属于另一种结构体类型,用若干个成员运算符一级级找到最低级的成员变量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct demo
{
short a; // 2 开辟8字节
int b; // 4
double c; // 8 开辟8字节
} ;
struct work
{
char ch;
struct demo d1;
}w1;
int main()
{
w1.d1.a=1;
w1.d1.b=20;
return 0;
}
3. 可以把成员变量当成普通变量运算(++ --都可以)
4. 在数组中,数组之间是不能彼此赋值的,结构体变量可以相互赋值