c语言结构体

基础语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*4种声明*/
//自定义数据类型的名
struct Test
{
//比直接定义多了类型定义
char face[10];
int EyeSize;
};
struct Test02
{
char face[10];
int EyeSize;
} test02;

struct
{
char face[10];
int EyeSize;
} test03;

typedef struct Test04 //给Test4增加别名:Test4
{
char face[10];
int EyeSize;
} Test04;
//可以如此声明: "Test04 test04"

void main(void)
{

int a;
a = 10;
//之一定义法
struct Test test01 = {"wzy", 20}; //声明赋值二合一

Test04 test05;
// test05.face = { "haha" };
// test05.face本质上是一个指针
strcpy(test05.face, "haha");
test05.EyeSize = 100;
printf("%s,%d\n", test05.face, test05.EyeSize);

//箭头运算符
// Test结构体声明的时候不开辟空间
//你必须初始化对象才开辟空间
Test04 test06, *ptest = &test06; //指向结构体Test04的指针并初始化结构体对象

strcpy(ptest->face, "hehehe");
//箭头运算符用于地址调用变量
ptest->EyeSize = 100;
(*ptest).EyeSize; //另一种不用箭头运算符的表示方式
printf("%s,%d\n", ptest->face, ptest->EyeSize);

system("pause");
}

结构体与内存四区

image-20220722204159834

结构体变量的相互赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//结构体变量的相互赋值
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct ModelFace
{
char face[10];
int EyeSize;

} ModeFace;

//定义结构体不开辟内存
//声明变量的时候才会开辟空间 tips:与类一样
int main(void)
{
ModeFace m1 = {"baby", 100}; //实例化一个对象

ModeFace m2 = m1; //相互赋值必须是同一个模板
printf("m2=%s,m2=%d", m2.face, m2.EyeSize);
printf("\n");
system("pause");
return 0;
}

结构体与数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//结构体数组
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct ModelFace
{
char face[10];
int EyeSize;
} ModeFace;

int main(void)
{
//类比
int a[3] = {1, 2, 3};

ModeFace m1[3] = {"baby1", 100, "baby2", 100, "baby3", 100}; //给结构体赋值 加入[3]是结构体数量

ModeFace m2[3] = {{"baby", 100},
{"baby", 100},
{"baby", 100}};
for (int i = 0; i < 3; i++) //遍历结构体数组
{
printf("face:%s,eyesize:%d\n", m1[i].face, m1[i].EyeSize);
printf("face:%s,eyesize:%d\n", m2[i].face, m2[i].EyeSize);
}
//结构体动态数组
int b[3] = {1, 2, 3}; //声明数组
int *pa = (int *)malloc(sizeof(int) * 3); // 声明指针
free(pa); //释放空间

ModeFace *pm = (ModeFace *)malloc(sizeof(ModeFace) * 3); //声明指针指向内存空间

if (pm == NULL)
{
return -1;
}

for (int i = 0; i < 3; i++)
{
strcpy(pm[i].face, "baby");
pm[i].EyeSize = 10 + i;
}
for (int i = 0; i < 3; i++)
{
printf("第%d个:%s,%d\n", i, pm[i].face, pm[i].EyeSize);
}
if (pm != NULL)
{
free(pm); //同一块空间不能free两次
pm = NULL;
}
printf("\n");
system("pause");
}