C语言 day15 | 我的日常分享

C语言 day15

结构体

  1. 结构体数据类型
  2. 结构体变量
  3. 结构体数组
  4. 结构体指针
  5. 结构体内存分配
  6. 结构体位段

结构体的定义形式

  • 三种方式:
    图片
1
2
3
4
5
6
7
8
9
10
11
//struct是结构体体关键字 stu是结构体类型名
//使用结构体定义变量 必须使用struct stu不能只用一个stu
//定义结构体类型时,不要给成员赋值(重要) 因为在定义结构体类型的时候,系统并没有给其分配空间,所以不能给成员赋值,只有在用结构体定义变量的时候系统才会给结构体分配空间
struct stu{
int num;
char name[32];
int age;
};//分号别忘了

//结构体中的成员拥有独立的空间

案例1:

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main(int argc,char *argv[]){
struct stu{
int num;//4
char name[32];//32
int age;//4
};
printf("%d\n",sizeof(struct stu));//将struct stu看成一个int 或者 char 等等等等
return 0;
}

运行结果:
图片

案例2:

1
2
3
4
char s1[128]="hello world!";
char s2[128]="";
s2=s1;//报错
//字符数组名是常量不能直接赋值
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
#include<stdio.h>
#include<string.h>
struct stu{
int num;
char name[32];
int age;
};
int main(int argc,char *argv[]){
struct stu lucy;//lucy是局部变量 lucy的成员内容不确定
printf("%d\n",sizeof(struct stu));
printf("%d\n",sizeof(lucy));
//通过结构体变量访问结构体中的成员,一定要遵循成员自身的类型
printf("%d\n",lucy.num);
printf("%s\n",lucy.name);
printf("%d\n",lucy.age);

printf("--------------------\n");
//赋值
lucy.num=1234;
//lucy.name="小辰";//报错
strcpy(lucy.name,"小辰");
lucy.age=18;

printf("%d\n",lucy.num);
printf("%s\n",lucy.name);
printf("%d\n",lucy.age);

return 0;
}

运行结果:
图片


结构体变量的初始化

  • 初始化的顺序 必须和成员的顺序一致

案例3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
#include<string.h>
struct stu{
int num;
char name[32];
int age;
};
int main(int argc,char *argv[]){
struct stu lucy={1234,"小辰",18};
printf("%d\n",lucy.num);
printf("%s\n",lucy.name);
printf("%d\n",lucy.age);
return 0;
}

运行结果:
图片

案例4:通过memset清空结构体变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<string.h>
struct stu{
int num;
char name[32];
int age;
};
int main(int argc,char *argv[]){
struct stu lucy={1234,"小辰",18};
printf("%d\n",lucy.num);
printf("%s\n",lucy.name);
printf("%d\n",lucy.age);
memset(&lucy,0,sizeof(lucy));
printf("%d\n",lucy.num);
printf("%s\n",lucy.name);
printf("%d\n",lucy.age);
return 0;
}

运行结果:
图片


结构体变量获取键盘输入

案例5:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
#include<string.h>
struct stu{
int num;
char name[32];
int age;
};
int main(int argc,char *argv[]){
struct stu lucy={0};
memset(&lucy,0,sizeof(lucy));

scanf("%d %s %d",&lucy.num,lucy.name,&lucy.age);
printf("%d\n",lucy.num);
printf("%s\n",lucy.name);
printf("%d\n",lucy.age);
return 0;
}

运行结果:
图片

结构体变量之间的赋值

案例6:

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
#include<stdio.h>
#include<string.h>
struct stu{
int num;
char name[32];
int age;
};
int main(int argc,char *argv[]){
struct stu lucy={1234,"小辰",18};
struct stu bob;
#if 0
//方式1:逐个成员赋值
bob.num=lucy.num;
//bob.name=lucy.name;
strcpy(bob.name,lucy.name);
bob.age=lucy.age;

printf("%d %s %d\n",bob.num,bob.name,bob.age);
#endif

#if 0
//方式2:相同类型的结构体变量可以直接赋值
bob=lucy;
printf("%d %s %d\n",bob.num,bob.name,bob.age);
#endif
//方法3:方法2的底层实现
memcpy(&bob,&lucy,sizeof(struct stu));
printf("%d %s %d\n",bob.num,bob.name,bob.age);

return 0;
}

运行结果:
图片


结构体数组

  • 本质是数组,只不过是用来存放结构体的数组,每个元素就是一个结构体变量

案例7:

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
#include<stdio.h>
#include<string.h>
struct stu{
int num;
char name[32];
int age;
};
int main(int argc,char *argv[]){
struct stu arr[3]={
{
100,
"小辰",
18
},
{
101,
"小花",
19
},
{
102,
"小明",
20
}
};
int n=sizeof(arr)/sizeof(arr[0]);
int i=0;

for(i=0;i<n;i++){
printf("num=%d name=%s age=%d\n",arr[i].num,arr[i].name,arr[i].age);
}

return 0;
}

运行结果:
图片

案例8:结构体获取键盘输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
#include<string.h>
struct stu{
int num;
char name[32];
int age;
};
int main(int argc,char *argv[]){
struct stu arr[3];
memset(arr,0,sizeof(arr));
int n=sizeof(arr)/sizeof(arr[0]);
int i=0;
printf("请输入%d个学生的信息:\n",n);
for(i=0;i<n;i++){
scanf("%d %s %d",&arr[i].num,arr[i].name,&arr[i].age);
}

for(i=0;i<n;i++){
printf("num=%d name=%s age=%d\n",arr[i].num,arr[i].name,arr[i].age);
}

return 0;
}

运行结果:
图片