绪论
书接上回,上一章将初阶的指针讲完了,相信只要你将该章节读完,肯定对大部分的指针有了一定的了解,并且你肯定对指针这一重要的知识点有了个基础的认识,本章将写的内容时初阶的结构体,当你将本认真的读完,相信你肯定也会对什么是结构体、以及结构体的使用,有更深的了解。
所以安全带系好,发车啦(建议电脑观看)。
附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或者其余颜色为次重点;黑色为描述需要
思维导图:
要XMind思维导图的话可以私信哈
目录
1.结构体的声明
1.1结构体
知识点:
1.1.1结构体:
一些值的集合,这些值被称为结构体成员变量,其中每个结构体成员变量的类型可以不同(这点和数组有区别在于:数组是一组相同类型的变量),就是因为我们的这些类型无法满足对一些复杂对象的描述(如一个人、一俩车、一台电脑,他们都有着多种不同的类型(人的身高,体重,姓名....)组成),所以我们需要一个可以描述这种复杂对象的变量
1.2结构体的声明
知识点:
1.2.1语法:
struct tag //(创建的一种新类型)
{
member list;//结构体成员
}variable list;//结构体的变量
实例:
描述一个学生
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;
注意:结构体类型后必须加 分号( ;)
1.3结构体成员的类型
知识点:
结构体成员可以是变量、数组、指针、结构体。
1.4结构体变量的定义和初始化
1.4.1知识点:
当我们创建了结构体类型(struct tag)后,我们可以直接在类型后面加上变量名就生成了一个结构体变量,或者还可以生成全局的结构体变量(和生成全局变量一样在(主)函数外创建一个“变量类型加变量名”),或者可以生成局部的结构体变量((主)函数内创建一个变量“变量类型加变量名”)。
1.4.2代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct score
{
int M;
int E;
};
struct Stu1
{
char name[15];
int number;//变量
char sex[3];//数组
struct score s;//嵌套结构体
int* Null;//指针
//struct Node* next;
}student = { "李华",12345,"女" };//直接在类型后创建的结构体变量
struct Stu1 student1 = { "李化" ,54321,"男"};//全局结构体变量
int main()
{
struct Stu1 n = { "李",321,"男",{90,60} ,NULL};//局部结构体变量
printf("%s %d %s %d %d %d", n.name, student1.number, student.sex,n.s.E,n.s.M,n.Null);//结构体的访问
return 0;
}
2.结构体成员的访问
2.1利用 . 操作符来进行访问
知识点:
在上面的代码中为了打印出结构体成员变量的值就使用了点操作符来进行访问,同理我们可以直接在代码块内进行结构体成员的改变;
细节:
当我们将这个结构体变量传进函数时(和正常的变量一样有传址,传值),在函数内我们可以通过指针,或者不用指针来接收。
当用指针传址调用接收时:
利用 -> 操作符访问
其中 (*name) . ... 他可以看成 name - > ... 上下是一种效果但第二种相较于第一种更方便快捷
当传值调用时:
附:一般传址调用来比较而不是改变该值
原代码:
struct score
{
int M;
int E;
};
void add(struct score a)
{
a.M = 60;
a.E= 90;
}
int main()
{
struct score s = { 90 , 60 };
printf("%d %d\n", s.E, s.M);
add(s);
printf("%d %d\n", s.E, s.M);
return 0;
}
struct score
{
int M;
int E;
};
void add(struct score *a)
{
//(*a).M = 60;
a->M = 60;
//(*a).E = 90;
a->E = 90;
}
int main()
{
struct score s = { 90 , 60 };
printf("%d %d\n", s.E, s.M);
add(&s);
printf("%d %d\n", s.E, s.M);
return 0;
}
3.结构体传参
3.1知识点:
3.2细节:
当我们在用两种不同的方法进行传参时,可以发现其效果是一样的,但他们有什么区别呢?
当你用传值调用时,他会将这个值真正的传递过去,如果值比较小可能还不会用什么很大的区别,但是当你这个值非常大的时候因为变量的进入需要压栈也就是占用一定的内存空间,使栈这个本就有限的空间,又被一个很大的值占了一定的空间,这样将会导致你的使用空间和性能下降。而传址调用时,就没用这种烦恼,他只是将其地址传递过去在通过这个地址来找到原来的空间,这样将一个地址传过去顶多只要4 / 8 byte的空间。
附: 所以建议在使用函数时,用传址调用(当然这里的结构体变量和正常的变量也一样建 议)。
本章完。预知后事如何,暂听下回分解。
持续更新大量C语言细致内容,三连关注哈