1.
#include<stdio.h> struct Student//定义结构体 { char name[10]; int age; }; int main() { struct Student stu;//声明结构体变量 scanf("%s%d",stu.name,&stu.age); printf("%s %d\n",stu.name,stu.age); return 0; }
2.
#include<stdio.h> struct Student//定义结构体同时声明结构体变量 { char name[10]; int age; }stu1,stu2; int main() { scanf("%s%d",stu1.name,&stu1.age); printf("%s %d\n",stu1.name,stu1.age); return 0; }
3.
#include<stdio.h> struct//定义结构体同时声明结构体变量,并省略了结构体类型名,此时不能再以此结构体类型去申明其他变量 { char name[10]; int age; }stu1,stu2; int main() { scanf("%s%d",stu1.name,&stu1.age); printf("%s %d\n",stu1.name,stu1.age); return 0; }
4.使用typedef的情况
#include<stdio.h> typedef struct Student { char name[10]; int age; }stu1,stu2;//给struct Student取了两个别名 int main() { stu1 stu; scanf("%s%d",stu.name,&stu.age); printf("%s %d\n",stu.name,stu.age); return 0; }
5.
#include<stdio.h> typedef struct Student { char name[10]; int age; }stu1,stu2[100];//给struct Student取了两个别名 int main() { stu2 stu;//声明了一个长度为100的结构体数组stu scanf("%s%d",stu[1].name,&stu[1].age); printf("%s %d\n",stu[1].name,stu[1].age); return 0; }
6.解析严蔚敏《数据结构》Page163的代码
typedef struct ArcNode//ArcNode不能省略,因为还要声明struct ArcNode *nextarc; { int adjvex; struct ArcNode *nextarc;//使用struct ArcNode 声明变量的原因是struct ArcNode 还没取别名 InfoType *info; }ArcNode; typedef struct VNode { VertexType data; ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertex;//vertex是长度为MAX_VERTEX_NUM的结构体数组 int vernum,arcnum; int kind; }ALGraph;
7.关于结构体的自引用
自引用 结构体
1.1 不使用typedef时
错误的方式:
[cpp] view
plaincopy
- struct tag_1{
- struct tag_1 A; /* 结构体 */
- int value;
- };
这种声明是错误的,因为这种声明实际上是一个无限循环,成员b是一个结构体,b的内部还会有成员是结构体,依次下去,无线循环。在分配内存的时候,由于无限嵌套,也无法确定这个结构体的长度,所以这种方式是非法的。
正确的方式: (使用指针):
[cpp] view
plaincopy
- struct tag_1{
- struct tag_1 *A; /* 指针 */
- int value;
- };
由于指针的长度是确定的(在32位机器上指针长度为4),所以编译器能够确定该结构体的长度。
1.2 使用typedef 时
错误的方式:
[cpp] view
plaincopy
- typedef struct {
- int value;
- NODE *link; /* 虽然也使用指针,但这里的问题是:NODE尚未被定义 */
- } NODE;
这里的目的是使用typedef为结构体创建一个别名NODEP。但是这里是错误的,因为类型名的作用域是从语句的结尾开始,而在结构体内部是不能使用的,因为还没定义。
正确的方式:有三种,差别不大,使用哪种都可以。
[cpp] view
plaincopy
- /* 方法一 */
- typedef struct tag_1{
- int value;
- struct tag_1 *link;
- } NODE;
- /* 方法二 */
- struct tag_2;
- typedef struct tag_2 NODE;
- struct tag_2{
- int value;
- NODE *link;
- };
- /* 方法三 */
- struct tag_3{
- int value;
- struct tag_3
*link; - };
- typedef struct tag_3 NODE;
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-12 10:34:05