图片[1]yxqzC语言的结构体yxqz小余塘

作者:余小小

日期:2021-10-02

结构体类型

  • 数组只能放相同类型数据

  • 结构体可以放不同类型 的数据

  • 使用关键字:struct

  • 结构体和枚举类似,都是作为自定义的数据类型使用

结构体可以有丰富的数据类型,比如一个人的基本属性,身高,体重,性别,年龄,存款,都是不同的数据类型吧

那么想要直接定义一个人,则需要使用结构体来装这些属性

回忆一下:

  1. 美剧(枚举):enum

  2. 字符串:char类型的数组

  3. 指针:新号

  4. 常量:const或使用#define宏定义

  5. 存储类:auto (局部变量,限制在当前代码块中使用),static(全局变量,当前c文件),register(寄存器中,可以快速访问),extern(文件变量,整个源程序)

定义结构体

必须使用 struct

struct 语句定义了一个包含多个成员的新的数据类型

struct 结构体类型名字 {
  age,
  sex,
  height,
  money
} 结构体变量 ;

 

  • 结构体结构,和枚举一样,也有匿名的方式,也有单独两步走策略,也有一步走策略

  • 可以说结构体,是为了修复枚举单一的数据类型,因为枚举只能放int类型的值

//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
struct
{
   int a;
   char b;
   double c;
} s1;

//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct SIMPLE
{
   int a;
   char b;
   double c;
};
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;

//也可以用typedef创建新类型
typedef struct
{
   int a;
   char b;
   double c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;

 

在上面的声明中,第一个(匿名的方式)和第二声明(两步走策略)被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令 t3=&s1,则是非法的。因为不是统一结构体

typedef:暂时不了解

结构体嵌套

  • 结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,

  • 而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。

//此结构体的声明包含了其他的结构体
struct COMPLEX
{
   char string[100];
   struct 其他结构体类型 a;
};

//此结构体的声明包含了指向自己类型的指针
struct NODE
{
   char string[100];
   struct NODE *next_node;
};

 

  • 如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明

  • 你中有我我中有你

struct B;    //对结构体B进行不完整声明

//结构体A中包含指向结构体B的指针
struct A
{
   struct B *partner;
   //other members;
};

//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
   struct A *partner;
   //other members;
};

 

结构体类型变量的初始化

和其它类型变量一样,对结构体变量可以在定义时指定初始值。

#include <stdio.h>

struct Books
{
  char  title[50];
  char  author[50];
  char  subject[100];
  int   book_id;
} book = {"C 语言学习", "鱼香茄子", "编程语言", 123456};

int main()
{
   printf("标题 : %s\n 作者: %s\n 学科: %s\n 图书: %d\n", book.title, book.author, book.subject, book.book_id);
}

 

访问结构成员

  • 为了访问结构的成员,我们使用成员访问运算符(.)。简单的说,就是结构体变量名字打点调用属性,可以和Java中的对象做比较,要注意的是,每一个对象都是单独的哦,不是操作的同一个对象

  • 成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。

  • struct 关键字来定义结构类型的变量。

要知道,是用结构体变量名字打点

指向结构体类型的指针

定义指向结构的指针,方式与定义指向其他类型变量的指针相似

定义结构体

struct Books
{
  char  title[50];
  char  author[50];
  char  subject[100];
  int   book_id;
} book1 = {"C 语言学习", "鱼香茄子", "编程语言", 123456};

 

定义指针结构体(结构体的指针)

struct Books *book_p;

 

将book1的地址赋值给指针结构体

book_p = &book1;

 

使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符

用指针访问指向的结构体中的属性

book_p->title;

 

连续代码

#include <stdio.h>
struct Books{    
   char  title[50];    
   char  author[50];  
   char  subject[100];  
   int   book_id;
}
book1 = {"C 语言学习", "鱼香茄子", "编程语言", 123456};
int main( ){  
   struct Books *book_p;  
   book_p = &book1;
   printf("指针获取结构体中的属性值:%s\n",book_p->title);  
   return 0;
}

 

image-20211201231634660

文章版权声明 1、本网站名称:小余塘
2、本站永久网址:https://www.yxqz.top/
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长QQ2457431511进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容