目录
定义:
struct即结构体,亦被直接称为“结构”。实际编程时,经常需要用相关的不同类型的数据来描述一个数据对象。例如,描述学生的综合信息时,需要使用学生的学号、姓名、性别、成绩以及家庭住址等不同类型的数据。但是,用相关的不同类型的数据来描述一个数据对象会使编程极为不便。因此,C语言提供了一种称为结构体(struct)的数据类型,以描述需要不同类型数据的数据对象。(摘自百度百科)
定义形式:
据我试验,结构体有3种定义方法(在不考虑使用typedef的情况下):
①:struct [结构体名]
{
[成员1数据类型] [成员1名称];
[成员2数据类型] [成员2名称];
[...]
} ;
②:struct
{
[成员1数据类型] [成员1名称];
[成员2数据类型] [成员2名称];
[...]
} [结构体变量名标识符(类似int a;中的a是一个标识符)];
③:struct [结构体名]
{
[成员1数据类型] [成员1名称];
[成员2数据类型] [成员2名称];
[...]
} [ 结构体变量名标识符(类似int a;中的a是一个标识符)];
那么,这几种有什么区别呢?
①是只定义了一个名字为[结构体名]的结构体类型,我们可以通过struct [结构体名] [标识符]
的形式在需要的地方定义一个这种数据类型的变量。
②是只定义了一个这种结构体类型的数据,如果我们用这种方式的话,我们就只能在这里定义这种数据类型的变量。
③则是①和②的结合体。
我们通过一段代码来认识它们:
#include <stdio.h>
struct stu1
{
char name[10];
int age;
};
struct
{
char name[10];
int age;
}stu2x={"李四",22};
struct stu3
{
char name[10];
int age;
}stu3x;
struct stus
{
struct stu3 sstu3x;
}stusx;
int main()
{
struct stu1 stu1x={"张三",21};
struct stu3 stu3y={"赵六",24};
// stu2x={"李四",22};
stu3x.age=23;
strcpy(stu3x.name,"王五"); //字符串赋值的一种方法,因为无法直接等于
stusx.sstu3x.age=3000;
strcpy(stusx.sstu3x.name,"七七");
printf("姓名:%s 年龄:%d\n",stu1x.name,stu1x.age);
printf("姓名:%s 年龄:%d\n",stu2x.name,stu2x.age);
printf("姓名:%s 年龄:%d\n",stu3x.name,stu3x.age);
printf("姓名:%s 年龄:%d\n",stu3y.name,stu3y.age);
printf("姓名:%s 年龄:%d\n",stusx.sstu3x.name,stusx.sstu3x.age);
printf("%d %d %d\n",sizeof(stu1x),sizeof(stu2x),sizeof(stu3x));
return 0;
}
那么,我们实际上用那种呢?其实我们这三种都不用,因为我们还有一个关键字(typedef)可以用,在typedef一节会讲到。
结构体数据赋值方法:
①:定义时赋值,就是在定义变量后,直接用={[成员1数据],[成员2数据],...};
这种赋值方法只适用于定义时,定义后这样赋值就会报错。
②:通过[结构体变量名标识符(类似int a;中的a是一个标识符)]. [成员n名称]=[成员n数据],这种方法也有一个缺陷,就是字符串无法直接赋值,需要使用strcpy之类的函数。最后就是当结构体中的成员也是结构体时,我们直接.下去套娃即可,上面的代码均可体现。
使用typedef定义结构体:
typedef是将定义复杂的声明定义成简单的别名,便于记忆和再次定义变量时使用。
在结构体中就是将定义的结构体类型用一个新的别名代替。
它也有有两种:
①:typedef struct
{
[成员1数据类型] [成员1名称];
[成员2数据类型] [成员2名称];
[...]
} [别名];
②:typedef struct [结构体名]
{
[成员1数据类型] [成员1名称];
[成员2数据类型] [成员2名称];
[...]
} [别名];
它们与结构体定义的②和③相似,区别是在最前面加了typedef,后面的 [结构体变量名标识符(类似int a;中的a是一个标识符)]换成了[别名],然后就是后面不能定义变量。
这个也很好理解:先看一段语句:typedef unsigned int uint32_t;
这段语句中unsigned int就相当于typedef struct [结构体名],uint32_tt就相当于[别名],至于这(typedef unsigned int uint32_t)后面不能定义变量应该都知道吧。
同时,typedef定义结构体①和②的区别也就一目了然了,就是②可以用struct [结构体名] 的形式去定义结构体变量,但是我都用typedef了,还需要这个?,所以用第一种就行。
最后也给出一段代码:
#include <stdio.h>
typedef struct stut1
{
char name[10];
int age;
}stut1x;
typedef struct
{
char name[10];
int age;
}stut2x ;
int main()
{
struct stut1 stut1xx={"张三",21};
stut1x stut1xy={"李四",22};
stut2x stut2xy={"王五",23};
printf("姓名:%s 年龄:%d\n",stut1xx.name,stut1xx.age);
printf("姓名:%s 年龄:%d\n",stut1xy.name,stut1xy.age);
printf("姓名:%s 年龄:%d\n",stut2xy.name,stut2xy.age);
return 0;
}