1.为什么需要结构体?
没有结构体之前,在C语言中,数据的组织依靠:变量+数组。
最初最简单的时候,只需要使用基本数据类型(int char float double)来定义单个变量,需要几个变量就定义几个。
后来情况变复杂了,有时需要很多意义相关的变量(譬如需要存储及运算一个班级的学生分数)这时候数组出现了。数组解决了需要很多类型相同、意义相关的变量的问题。但是数组是有限制的。数组最大的不足在于,一个数组只能存储很多个数据类型相同的变量。所以碰到需要封装几个类型不同的变量的时候,数组就无能为力。
2.什么是结构体?
-
结构体是一个集合,集合中包含很多个元素,这些元素的数据类型可以相同,也可以不相同。所以结构体是一种数据封装的方法。结构体存在的意义就在于,把很多数据类型不相同的变量封装在一起,组成一个大的新的数据类型。
-
数据结构:把庞大复杂的数据用一定的方式组织管理起来,便于操作(查找,增加,删除等)这就叫数据结构。
结构体和数组的关联:
- 数组是一种特殊的结构体,特殊之处在于封装内的各个元素类型是相同的。结构体和数组都是对一些子元素的封装,因此定义的时候都是封装作为整体定义,但是使用的时候,都是使用封装中的子元素。一般结构体变量和数组变量都不会作为一个整体操作。
3.结构体的初始化
-
结构体变量和普通变量一样,作为局部变量时,如果定义的时候无初始化也无显式赋值,则结构体变量中的子元素的值是随机的。
发现2种C语言接受的结构体初始化方式。
第一种,完全初始化。{xx, xx, xx, xx, xx};
第二种,部分初始化。
{
.a = xx,
.b = xx,
.c = xx,
.d = xx,
}; -
新增关键字: struct
-
新增操作符: .
// 1、结构体类型的定义是在函数外面,不是里面
// 2、结构体定义的是一个新的组合类型,而不是变量,也不消耗内存。
// 稍后在定义变量的地方,再使用该结构体类型来定义变量。
struct Student
{
char name[20]; // 学生姓名
unsigned int num; // 学号
int isMale; // 性别
};
struct MyStruct
{
int a;
char c;
float f;
double d;
}; // 注意这里的;不能少
struct ArrayStruct
{
int a;
int b;
int c;
int d;
};
使用
int main(void)
{
/*
int a[4];
ArrayStruct s1;
*/
//struct MyStruct s = {100, 'd', 12.445, 111.111111111111}; // ok
//struct MyStruct s = {100; 'd'; 12.445; 111.111111111111}; // 不行
/*
// 这种部分ok的是最危险的,千万不用。
struct MyStruct s =
{
s.a = 1444, // 只能从前到后依次初始化,重要只要空
s.c = 'k', // 一个,后面的就遭殃了
s.f = 3.13,
//s.d = 32.222222,
}; // 部分ok
*/
/*
struct MyStruct s =
{
s.a = 1444;
s.c = 'k';
s.f = 3.13;
s.d = 32.222222;
}; // 不行,初始化式中分号不好用
*/
/*
struct MyStruct s =
{
//.a = 1444,
.c = 'k',
.f = 3.13,
.d = 32.222222,
}; // ok
*/
/*
struct MyStruct s =
{
a = 1444,
c = 'k',
f = 3.13,
d = 32.222222,
}; // 错误,.是不能省略的
*/
/*
struct MyStruct s =
{
. = 1444,
. = 'k',
. = 3.13,
. = 32.222222,
};
*/ // 不行,.后面的元素名不可省略。
printf("s.c = %c, s.d = %f.\n", s.c, s.d);
/*
struct MyStruct s; // 先定义变量,定义同时无初始化
s.a = 1444; // 定义之后再赋值
s.c = 'k';
s.f = 3.1415;
s.d = 3.423246;
s.a += 100;
printf("s.a = %d.\n", s.a);
//s.c = 'y';
printf("s.c = %c.\n", s.c);
*/
/*
struct Student s1; // s1是一个变量,类型是struct Student
// 给结构体变量赋值
s1.name[0] = 'J';
s1.name[1] = 'i';
s1.name[2] = 'm';
s1.name[3] = '\0';
s1.num = 123;
s1.isMale = 1;
// 打印检验看对不对
printf("s1.name = %s, s1.num = %d, s1.isMale = %d.\n",
s1.name, s1.num, s1.isMale);
*/
return 0;
}
标签:struct,int,s1,MyStruct,xx,结构,变量
From: https://www.cnblogs.com/zggb/p/17175694.html