C[8] 结构体struct

C[8] 结构体struct

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义 。

1、定义结构体

C语言提供了关键字struct来标识所定义的结构体类型。

1
2
3
4
5
6
struct tag {    //tag 是结构体标签。
    member-list         //member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。
    member-list
    member-list 
    ...
} variable-list ;   //variable-list 结构变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量.

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//1、结构体中,tag 和 variable-list 至少要出现1个,示例:
//1.1 没有tag标签的结构体,
struct {
    int a1;   //整型
    char a2;   //字符型
    double a3;   //双精度
} test;   //结构体变量
 
//1.2 没有结构体变量的结构体,
struct Ttest{
    int a1;
    char a2;
    double a3;
};
struct Ttest t1, t2[5], *t3;    //使用用Test 标签的结构体,声明了变量 t1、t2、t3
 
//2、结构体包含
struct Ttest2{
    char string[50];
    struct Ttest1 a;   //此结构体的声明包含了其他的结构体
};
 
struct Ttest3{
    char string[50];
    struct Ttest3 *N1;   //此结构体的声明包含了指向自己类型的指针
};
 
//如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示:
struct B;     //对结构体B进行不完整声明
struct A{
    struct B *p;   //结构体A中包含指向结构体B的指针
    //其他成员
};
struct B{
    struct A *p;  //结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
    //其他成员
};

2、结构体变量的初始化、成员访问、函数访问、结构指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <stdio.h>
#include <string.h>
//滔Roy  2021.11.05
struct Ttest{
    int a1;
    char a2[100];   //定义大小 char a2[100];
    double a3;
};
 
struct Ttest1{
    int a1;
    char a2[100];
    double a3;
}test3={150,"Hello TaoRoy3!",45.67} ;
 
void printTest( struct Ttest test );   //函数声明
void printTestP( struct Ttest *test );  //函数声明 指针参数
int main( )
{
   struct Ttest test1;        /* 声明 test1,类型为 Ttest */
   struct Ttest test2;        /* 声明 test2,类型为 Ttest */
   struct Ttest test4;        /* 声明 test4,类型为 Ttest */   //测试结构作为函数参数的输出
   struct Ttest test5;        /* 声明 test5,类型为 Ttest */   //测试结构作为函数指针参数的输出
 
   /* test1 详述 */
   test1.a1=100;
   strcpy( test1.a2, "Hello TaoRoy1!");   //不能这样写: test1.a2="Hello TaoRoy1!";
   test1.a3=99.99;
 
   /* test2 详述 */
   test2.a1=50;
   strcpy( test2.a2, "Hello TaoRoy2!");
   test2.a3=12.34;
 
   /* 输出 test1 信息 */
   printf( "test1.a1 : %d\n", test1.a1);
   printf( "test1.a2 : %s\n", test1.a2);
   printf( "test1.a3 : %4.2f\n", test1.a3);
 
   /* 输出 test2 信息 */
   printf( "test2.a1 : %d\n", test2.a1);
   printf( "test2.a2 : %s\n", test2.a2);
   printf( "test2.a3 : %4.2f\n", test2.a3);
 
   /* 输出 test3 信息 */
   printf( "test3.a1 : %d\n", test3.a1);
   printf( "test3.a2 : %s\n", test3.a2);
   printf( "test3.a3 : %4.2f\n", test3.a3);
 
   /* test4 详述 */
   test4.a1=44;
   strcpy( test4.a2, "Hello TaoRoy4!");
   test4.a3=44.39;
 
   printTest(test4);  /* 结构作为函数参数的输出 test4 信息 */
 
   /* test5 详述 */
   test5.a1=55;
   strcpy( test5.a2, "Hello TaoRoy5!");
   test5.a3=55.55;
 
   printTestP(&test5); //使用& 运算符放在结构名称的前面,查找结构变量的地址
 
   return 0;
}
 
void printTest( struct Ttest test )
{
   printf( "test.a1 : %d\n", test.a1);
   printf( "test.a2 : %s\n", test.a2);
   printf( "test.a3 : %4.2f\n", test.a3);
}
 
void printTestP( struct Ttest *test )
{
   printf( "test->a1 : %d\n", test->a1);   //结构的指针访问结构的成员,必须使用 -> 运算符
   printf( "test->a2 : %s\n", test->a2);
   printf( "test->a3 : %4.2f\n", test->a3);
}

 

 

 

 

创建时间:2021.11.05  更新时间:

posted on   滔Roy  阅读(168)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报

导航

点击右上角即可分享
微信分享提示