赞
踩
目录
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 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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。