C语言中的结构体
结构体的概念
结构体的本质是一种数据类型,它可以包含若干个成员,每个成员的类型可以相同或者不同,可以是基本数据类型(如整形int,浮点型float,字符类型char等)或者是又一个构造类型(数组,结构体,枚举类型,共用体等)。
它不仅可以记录不同类型的数据,也利于程序的阅读与移植。
结构体声明与结构体变量的定义
下面的代码描述了一个含有三个不同类型成员的结构,但并未创建一个实际的数据对象,每个成员变量都用自己的声明来描述,花括号后的分号表示结构声明的结束。结构体声明可以放在函数的外面,作为全局结构体,可以在它之后的所有函数使用。也可以放在函数外面,此时为局部结构体,只可以在该函数内使用,若与全局结构体同名,便会暂时屏蔽全局结构体。
struct X
{
char a [20];
int b;
float c;
};
下面用三种方式来定义结构体变量
struct X
{
char a [20];
int b;
float c;
};
struct X st1; //结构体变量定义在结构体的声明之后
struct X
{
char a [20];
int b;
float c;
}st1; //结构体变量定义在结构体的声明跟变量名
struct
{
char a [20];
int b;
float c;
} st1; //使用匿名结构体来定义结构体变量,此方式不可以再定义新的结构体变量了,慎用
访问结构体成员的方法
结构体不可以像数组一样通过访问下标的方式去访问其中的元素,应该采用结构成员运算符(.),其访问成员的形式如下代码所示
struct X
{
int a;
int b;
int c;
};
struct Y
{
char d;
float e;
struct X f;
}st1;
stu1.f.a//此语句的意思是访问a
结构体变量的初始化
结构体的初始化有三种方法,即与结构体定义同时进行,在定义之后对结构体初始化,用一个已经存在的结构体去初始化和一个新的相同类型的结构体变量,分别如下代码所示
/******************定义,初始化同时进行************/
struct X{
char a;
int b;
float c;
}st = {"what",10,20.1}; //保持顺序一致
struct X st = {.a = "what",.b = 10,.c = 20.1}; //任意顺序初始化
struct X st = {.a = "what"}; //部分初始化
/******************初始化在定义之后进行************/
struct X{
char a;
int b;
float c;
}st;
strcpy(stu1.a,"what"); //字符串赋值
st.b = 10;
st.c = 20.1; //分别初始化
st = (struct X){"what",10,20.1}; //整体初始化
/*****************用已存在的结构体去初始化一个新的结构体变量***********/
struct X{
char a;
int b;
float c;
}st1 = {"what",10,20.1};
struct Y{
char d;
int e;
float f;
}st2;
st2 = st1;
结构体数组
结构体可以作为数组的元素的类型,元素属于结构类型的数组称为结构型数组。以下用代码的方式展示了结构数组的定义,初始化,输出
struct X{
char a;
int b;
float c;
}st[5]; //定义一个结构数组,含有6个元素
struct X st[0] = {"aaa",10,20.1}; //定义,初始化同时进行
st[1] = (strcut X){"ccc",12,12.1}; //先定义,后初始化
strcpry (st[2].a,"ddd"); //将结构体变量的成员逐个赋值
st[2].b = 13;
st[2].c = 23.1;
int length = sizeof(st)/sizeof(struct X);
for (int i = 0; i<length; i++){
printf ("word:%s num1:%d num2:%f \n",st[i].a,st[i].b,st[i].c);
}
结构体与指针
一个用来指向一个结构变量的指针变量称之为结构指针变量,结构指针变量的值是所指向结构变量的首地址。
以下的代码展示了如何对结构指针变量进行定义和访问,结构变量名表示整个结构变量,并不表示结构变量的首地址。因此不可以直接赋值给结构指针变量,要使用&运算符把结构变量的地址赋值给结构指针变量。
struct X{
char a;
int b;
float c;
};
struct student *pst; //定义了一个指向X的的结构指针变量
(*pst).a; //第一种结构指针变量的访问方式
pst->b; //第二种结构指针变量的访问方式
结构体的嵌套
结构体中的成员可以是另一个结构体,从而实现结构体的嵌套。
结构体可以实现多层的嵌套(即一个套一个的多次嵌套)
结构体不可以嵌套跟自己相同类型的结构体,但可以嵌套定义自己的指针。如下代码所示
/****************以下为错位写法*****************/
struct X{
char a;
int b;
float c;
}st;
struct Y{
char d;
int e;
float f;
struct X st;
};
/***************以下为正确写法*****************/
struct X{
char a;
int b;
float c;
};
struct X *pst;
struct Y{
char d;
int e;
float f;
struct X *st;
};
结构体与函数
结构体的成员可以作为函数的参数,属于值传递。
结构体变量也可以作为函数的参数传递。
当结构体的成员含有数组,最好使用指针。