C语言结构体学习笔记
- 什么是结构体?
c语言中有很多种数据类型,但给一个变量初始化时我们往往只能将其定义为一种数据类型(常见的有整型,浮点型,字符型)。我们可以将变量想象成一个糖果盒,在没有定义结构体的情况下,糖果盒只能装一种口味的糖果。而在有结构体的加持下,我们就可以向糖果盒中装下不同口味的糖果辽,所以结构体使变量中储存的数据更加集中更加具体更加多元。
2. 如何定义一个结构体和初始化变量?
结构体定义的方式有点像函数的定义,结构体的定义旨在于给多种数据类型进行一个封装,为后面属于该结构体的数据类型的变量声明提供便利。
# include <stdio.h>
struct person_imformation
{
char name[20];
int age;
char gender[5];
char phone[20];
};
struct person_imformation num1,num2,num3;
int main()
{
}
以上述代码为例,程序中定义了一种个人信息的结构体,结构体里分别包含了字符类型的姓名变量,整型的年龄变量,字符型的性别变量,字符型的手机号码变量,接着声明了三个符合该数据结构类型的变量,这样我们在对变量初始化的时候就可以揉合多种类型数据。
# include <stdio.h>
struct person_imformation
{
char name[20];
int age;
char gender[20];
char phone[20];
};
int main()
{
struct person_imformation num1 = {"Lindy",12,"female","12345678900"};
struct person_imformation num2 = {"Sam",18,"male","18518418218"};
}
定义完结构体后,我们就可以在程序的入口main()函数里进行对变量进行初始化了,值得注意的是变量初始化赋值时{}里的数据类型要与结构体本身一一对应,不同的数据之间要用逗号隔开。当然我们也可以直接在定义完结构体后直接初始化变量,但不推荐。
3. 结构体成员的访问与逻辑运算
在访问结构体成员中的数据时需要运用到点运算符”.” ,这有点类似于windows中访问文件的路径,虽然windows中是以”/”来区分不同目录的层级,但访问方式比较像,所以我们在访问结构体成员中不同的数据时可以理解为反向解开封装来取出里面的物体。
# include <stdio.h>
struct person_imformation
{
char name[20];
int age;
char gender[20];
char phone[20];
};
int main()
{
struct person_imformation num1 = {"Lindy",12,"female","12345678900"};
struct person_imformation num2 = {"Sam",18,"male","18518418218"};
printf("%s %d %s %s",num1.name,num1.age,num1.gender,num1.phone);
printf("\n");
printf("%s %d %s %s",num2.name,num2.age,num2.gender,num2.phone);
}
我们也可以通过这种方式读取键盘输入来对结构体成员进行初始化操作,或者利用逻辑判断符来实现对不同结构体成员中具体数据的比较。
# include <stdio.h>
struct person_imformation
{
char name[20];
int age;
char gender[20];
char phone[20];
};
int main()
{
struct person_imformation num1 = {"Lindy",12,"female","12345678900"};
struct person_imformation num2 = {"Sam",18,"male","18518418218"};//给结构体成员初始化
if (num1.age>num2.age)
{
printf("%s is %d years older than %s ",num1.name,num1.age-num2.age,num2.name);
}
else if (num1.age==num2.age)
{
printf("%s and %s are of the sam age",num1.name,num2.name);
}
else if (num1.age<num2.age)
{
printf("%s is %d years older than %s ",num2.name,num2.age-num1.age,num1.name);
}
}
在结构体成员中同样也支持不同数据类型本身的逻辑比较判断和逻辑运算法则,这样就可以更大的体现结构体的优势,不仅储存数据更加多元集中,也让各种数据之间的比较更加便捷。
4. 数组加上结构体的buff
c语言中数组给我们储存大量数据和有顺序的数据访问提供了无限可能,而当数组碰上结构体那更是buff叠加,结构体数组让我们不仅能充分利用结构体存储数据的多元性,也让数组数据访问的有序性展现的淋漓尽致。
# include <stdio.h>
struct person_imformation
{
char name[20];
int age;
char gender[10];
};
int main()
{
struct person_imformation arr1[3];
for (int i=0;i<3;i++)
{
scanf("%s%d%s",&arr1[i].name,&arr1[i].age,&arr1[i].gender);//利用结构体数组获取键盘输入
}
for (int i=0;i<3;i++)
{
printf("%s is %d years old ,a %s\n",arr1[i].name,arr1[i].age,arr1[i].gender);
}
}
通过上述程序我们储存了不同人的个人信息,储存过程也类似数组初始化的形式,只不过数组这个大盒子里有不同的的小盒子专门储存封装对应的数据。
异想天开的人会问,结构体数组中能不能继续嵌套数组捏?那当然是能的,就像俄罗斯套娃一样,数据也可以通过不同层级分类来实现套娃封装。
#include <stdio.h>
struct person_imformation
{
char name[20];
int age;
double height[2];
double weight[2];
};
int main()
{
struct person_imformation arr1[2];
for (int i = 0; i < 2; i++)
{
scanf("%s%d", &arr1[i].name, &arr1[i].age);
for (int j = 0; j < 2; j++)
{
scanf("%le%le", &arr1[i].height[j], &arr1[i].weight[j]);
}
}
for (int i = 0; i < 2; i++)
{
double sum1 = 0.00;
double sum2 = 0.00;
double BMI;
for (int j = 0; j < 2; j++)
{
sum1 += arr1[i].height[j];
sum2 += arr1[i].weight[j];
}
sum1=sum1/2;
sum2=sum2/2;
BMI=sum2/(sum1*sum1);
printf("%.2lf %.2lf",sum1,sum2);
printf("%s is %d years old and BMI is %.2lf\n", arr1[i].name, arr1[i].age,BMI);
}
}
上述程序就运用结构体和数组嵌套实现了身高和体重的多次输入求平均值再计算BMI,在结构体成员中有效储存多种多次数据来减小误差,获取更精准的BMI值。
结构体和结构体的嵌套也类似结构体和数组的嵌套,遵循套娃原理。
5. 结构体和函数的大招
我们知道,C语言的精髓在于函数的使用,而借助函数的参数传递性,我们可以将结构体成员的数据传到函数里并进行函数的调用递推和嵌套,更加充分发挥结构体数据的集中化和多元化优势。
#include <stdio.h>
struct person_imformation
{
char name[20];
int age;
double height;
double weight;
};
double BMI_compare(double x,double y,double max) //定义一个BMI比较函数,返回值是double
{ double BMI=y/(x*x);
if (max>=BMI)
{
return (max);
}
else
{
return (BMI);
}
}
int main()
{int a=0;
struct person_imformation arr1[5];
for (int i = 0; i < 5; i++)
{
int t=a;
scanf("%s%d%le%le", &arr1[i].name, &arr1[i].age,&arr1[i].height, &arr1[i].weight);
a = BMI_compare(arr1[i].height, arr1[i].weight,t);//每次比较返回最大值再次比较时向函数返回最大值
printf("%d",a);
}
}
上述代码实现五个人中BMI的比较并最后输出最大的BMI值,充分利用函数传参和逻辑运算的模块化集中来简化BMI值的比较。