文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、从数组到结构体
c语言中,数组是有序数据的集合并且数组中的每个元素必须是同一种数据类型,c语言中不能够将不同的数据类型放到同一个数组中。显然,c语言中数组数据类型存在不足,例如,我们想要存储一个学生的信息:年龄,性别,分数等不同的数据类型时候,使用数组是无法解决这样问题,而使用结构体这样的数据类型便可以很方便的搞定这样的问题。
c语言中允许用户自己建立由不同种数据组成的组合型数据结构,它称为结构体(structure)。在其他的高级语言中也叫做记录(record)。
结构体一种构造数据类型。一个结构体由若干个成员组成而且成员的数目必须固定(这一点和数组相同),成员的类型可以是不同种数据类型(如:int,char,float,或者是结构体类型等)。
二、结构体声明
既然结构体是自己构造的数据类型,所以我们需要告诉编译器这种数据类型或‘模式’,也就是要声明结构体。声明结构体类型的一般形式为:
struct 结构体标识名
{
类型名 1 结构成员名表 1;
类型名 2 结构成员名表 2;
...
类型名 n 结构成员名表 n;
};
其中struct是关键字,是结构体类型的标志。结构体标识名是可选参数,可有可无。
代码如下(示例):
struct date
{
int year;
int month;
int day;
float hour;
};
注意,此处的声明只是告诉编译器这种结构“模式”已经存在,编译器并没有为它开辟内存空间。只有定义了相应的结构体类型变量时,其才会占用内存。
三、结构体类型变量定义
1.紧跟结构体声明后进行定义
这种定义方式是在结构体的声明后直接进行结构体类型变量的定义,如下代码所示:定义了结构体变量,结构体数组和指向结构体的指针。
代码如下(示例):
struct student
{
char name[12];
char sex;
struct date birthday;
float score[4];
} std,pers[3],* pstd;
2.紧跟无名结构体类型后进行定义
由于结构体标识名是可选参数,可有可无,所有在结构体变量进行定义时,我们可以选择忽略结构体标识名,即与上边的定义相比省去student。
代码如下(示例):
struct
{
char name[12];
char sex;
struct date birthday;
float score[4];
} std,pers[3],* pstd;
3.先声明结构体类型,再进行变量定义
这样的定义方式就显得自然些。首先进行变量的声明,然后像通常的变量定义一样进行定义(如 int a[5];)。
struct sutdent
{
char name[12];
char sex;
struct date birthday;
float score[4];
};
struct sutdent std,pers[3],* pstd;
注意,进行变量定义时,此时的结构体标识符不能省略,此时的结构体类型是:struct+结构体标识符
4.使用typedef先声明再用新的类型名进行定义
typedef struct sutdent
{
char name[12];
char sex;
struct date birthday;
float score[4];
} STD;
STD std,pers[3],* pstd;
四、结构体变量初始化
下面代码对一个结构体变量进行赋值,如果对结构体数组进行赋值时,方法和对多维数组赋值相同。
struct date
{
int year;
int month;
int day;
float hour;
};
struct sutdent
{
char name[12];
char sex;
struct date birthday;
float score[4];
} std={"Mars","M",2021,1,1,1,99,99,99};
注意,对结构体变量进行初始化时,一定要按照顺序进行赋值。可以只给前若干个成员进行初始赋值,后面的未进行赋值的系统将默认设置为0;
五、结构体的引用
对于结构体变量的引用,方法有三种,下面罗列如下:
- 结构体变量名.成员名(.表示结构体成员运算符);
- 指针变量名->成员名;
- (* 指针变量名).成员名;
六、函数与结构体
1.向函数传递整个结构体变量中的数据
当把结构体变量中的数据作为一个整体传送给相应的函数形式参数(函数的形参类型和结构体类型一致)时,传递的是结构体的值,系统将为结构体类型的形参开辟相应的内存单元,并将实参成员的值一一传递给形参中的成员。函数只是对形参进行了操作,因此不过影响到实参的值。
2.向函数传递结构体的地址
当把结构体的地址传送给相应的函数形式参数(函数的形参类型为指向结构体的指针变量)时,系统只为形参指针开辟一个存储单元存放结构体变量的地址,而不建立一个结构体变量。此时通过函数的调用便可以改变结构体变量的值。
3.向函数传递结构体数组名
向函数传递结构体数组名时,传递的是结构体数组的首地址,函数中对应的形参应为结构体数组变量,此时利用此指针进行操作时便可以影响到结构体中成员的值。
4.结构体数组名和传递整个结构体变量对比
#include <stdio.h>
typedef struct {
int num;
float score;
} Inf;
void f1(Inf x)
{
x.num = 0;
x.score = 0;
}
void f2(Inf x[])
{
x[0].num = 0;
x[0].score = 0;
}
int main(int agrc,const char * argv[])
{
Inf std1 = {1,100};
Inf std[] = {1,100};
printf("Num:%d Score:%f\n",std1.num,std1.score);
printf("Num:%d Score:%f\n",std[0].num,std[0].score);
f1(std1);
f2(std);
printf("Changed:\n");
printf("Num:%d Score:%f\n",std1.num,std1.score);
printf("Num:%d Score:%f\n",std[0].num,std[0].score);
return 0;
//结果输出如下:
Num:1 Score:100.000000
Num:1 Score:100.000000
Changed:
Num:1 Score:100.000000
Num:0 Score:0.000000
}