『C语言初阶』第八章 -结构体

简介: 『C语言初阶』第八章 -结构体

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

前言

今天小羊又来给铁汁们分享关于C语言的结构体,在C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型),今天我们主要简单了解一下结构体。


一、结构体是什么?

在实际问题中,一组数据往往有很多种不同的数据类型。例如,登记学生的信息,可能需要用到 char型的姓名,int型或 char型的学号,int型的年龄,char型的性别,float型的成绩。又例如,对于记录一本书,需要 char型的书名,char型的作者名,float型的价格。在这些情况下,使用简单的基本数据类型甚至是数组都是很困难的。而结构体则可以有效的解决这个问题。

结构体本质上还是一种数据类型,但它可以包括若干个“成员”,每个成员的类型可以相同也可以不同,也可以是基本数据类型或者又是一个构造类型。

结构体的优点:结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高CPU对内存的访问速度。

简单的来说,结构体就是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。


二、结构体声明

一般形式:

struct 结构体类型名
{
  成员列表
};

所以,struct关键词是表示接下来是一个结构体

例如,声明一个学生的结构:

struct Student{         //声明结构体
    char name[20];      //姓名
    int num;            //学号
    float score;        //成绩
};

上面的声明描述了一个包含三个不同类型的成员的结构,但它还没创建一个实际的数据对象,每个成员变量都用自己的声明来描述,以分号结束。花括号之后的分号表示结构声明结束。结构声明可以放在函数外(此时为全局结构体,类似全局变量,在它之后声明的所有函数都可以使用),也可以放在函数内(此时为局部结构体,类似局部变量,只能放在该函数内使用,如果与全局结构体同名,则会暂时屏蔽全局结构体)。


三、结构体变量的定义和初始化

当我们声明结构体的类型之后,接下来就要对结构i进行定义和初始化了。

struct student
{
  char name[20];
  int age;
  char sex[5];
  char id[20];
}s1,s2;           //声明类型的同时定义结构体变量
//定义结构体变量
struct student s3;
struct student s4;
int main()
{
  return 0;
}

上面的s1,s2,s3,s4就是普通的变量,放在全局中就是全局变量,刚在函数内部就是局部变量。

接下来看结构体初始化

struct student
{
  char name[20];
  int age;
  char sex[5];
  char id[20];
}s1 = { "zhuxinrui",21,"女","21006666" };
int main()
{
  //初始化:定义变量的同时赋值
  struct student s2 = { "yangrui",21,"女","210047218" };
  return 0;
}

1.typedef关键字

当我们每次定义结构体变量时,结构体的类型名过长,想要简化可以使用typedef来对结构体类型重定义

1:>

#include<stdio.h>
typedef struct student stu;
struct student
{
  char name[20];
  int age;
  char sex[5];
  char id[20];
};
int main()
{
  stu s3 = { "yangrui",21,"女","210047218" };
  return 0;
}

2:>

#include<stdio.h>
typedef struct student
{
  char name[20];
  int age;
  char sex[5];
  char id[20];
}stu;
int main()
{
  stu s4 = { "yangrui",21,"女","210047218" };
  return 0;
}

2.匿名结构体

匿名结构体类型是指声明结构体的时候,可以不完全的声明

struct 
{
  int num;
};

那么问题来了,匿名结构体类型该如何定义变量呢?

错误写法:

struct
{
  int num;
};
struct n1;
struct n2 = { 666 };

正确做法:

struct
{
  int num;
}n1,n2={666};

总结:

必须在声明匿名结构体类型时就定义变量。

四、结构体传参

当我们将结构体变量作为为函数参数进行传参的时候,该怎样接收并使用呢?

用法示例

结构体打印函数

#include<stdio.h>
typedef struct teacher T;
typedef struct student S;
struct teacher
{
  char name[20];
  char subject[20];
};
struct student
{
  char name[20];
  int age;
  char sex[5];
  char id[20];
  T t1;
};
S s1 = { "阿蕊",20,"女","21006666",{"老王","语文"} };
void print1(S s)
{
  printf("%-8s %-2d %s %s %s %s\n", s.name, s.age, s.sex, s.id, s.t1.name, s.t1.subject);
}
void print2(S* s)
{
  printf("%-8s %-2d %s %s %s %s\n", (*s).name, (*s).age, (*s).sex, (*s).id, (*s).t1.name, (*s).t1.subject);
}
int main()
{
  S s2 = { "小羊",21,"女","210047218",{"老丁","英语"} };
  print1(s1);
  print2(&s2);
  return 0;
}

问题来了,想一想print1和print2这两个函数,哪个更好呢?

小伙伴们想好了或者想不明白的可以问小羊,也可以评论区留言哦,最后希望这篇文章对大家在C语言的学习道路上有所帮助,大家跟好脚步,咱们很快就会跟新C语言进阶的内容了~

相关文章
|
5天前
|
C语言
C语言初阶:如何判断是否为素数并且输出
C语言初阶:如何判断是否为素数并且输出
8 0
|
5天前
|
编译器 测试技术 C语言
【C语言】:自定义类型:结构体的使用及其内存对齐
【C语言】:自定义类型:结构体的使用及其内存对齐
26 7
|
4天前
|
网络协议 编译器 Linux
结构体(C语言)
结构体(C语言)
|
15天前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
30 7
|
2天前
|
C语言
C语言中的结构体
C语言中的结构体
4 0
|
4天前
|
编译器 C语言 C++
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
8 0
|
4天前
|
存储 编译器 Linux
【c语言】详解结构体
【c语言】详解结构体
6 0
|
8天前
|
C语言
C语言---自定义类型:结构体(4)
C语言---自定义类型:结构体
|
8天前
|
编译器 C语言
C语言---自定义类型:结构体(3)
C语言---自定义类型:结构体
10 0
|
8天前
|
编译器 Linux C语言
C语言---自定义类型:结构体(2)
C语言---自定义类型:结构体