C语言知识补充之结构体和共用体

结构体和共用体

  一个事物往往都有多个方面的属性,比如学生就有名字、升高、各科成绩等等。用来描述此类数据的数据类型----结构体和共用体

 

一、结构体

1. 结构体类型

  结构体类型是一种数据类型,和整型、字符型、浮点型等一样。我们之所以可以用关键字int、char来定义变量,是因为C编译系统事先定义好了。但是C编译系统没有事先定义结构体类型,所以我们要先定义结构体类型才可以用。定义形式如下:

struct 结构体类型名
{
    数据类型1 成员名1;
    数据类型2 成员名2;
    ......
    数据类型n 成员名n;
};

  其中,数据类型可以任意,且可以嵌套定义结构体变量,嵌套又可以嵌套自己。如

struct date
{
    int year;
    int month;
    int day;
};
struct student
{
    char name[10];
    char sex;
    struct date birthday;
    int age;
    float score;
};

  注意,如果结构体类型的定义在函数体内部,那么这个函数名的作用域仅为该函数;如果在函数外部,则可以在整个程序中使用。结构体类型的定义只是由用户构造了一个结构体,但定义结构体类型时候系统并不为其分配存储空间。

2. 结构体变量

  先定义结构体类型,然后定义结构体变量,此时系统才会给结构体变量分配存储空间,此时结构体变量的存储空间等于成员所有存储空间之和,结构体变量的首地址就是首个成员的地址。结构体变量定义有三种格式:

  • Struct 结构体类型名

  {

       数据类型n  成员名;

       …………

  };

  Struct 结构体类型名 结构体变量1,结构体变量2,……;

  • Struct 结构体类型名

  { 

       数据类型n  成员名;

       …………

  }结构体变量1,结构体变量2,……;

  • 第三种就是没有结构体类型名的,这样使用typedef打字更方便。

3. 结构体变量的初始化

  类似于数组元素的初始化,例:

struct student
{
    char Name[20];
    float Math;
    float English;
    float Physical;
}stu[2]={{"zhang",78,89,95},{"wang",87,79,92}};

4. 结构体变量的引用

  • 对结构体变量成员的引用:结构体变量名.成员名

    这是一个整体,就相当于一个变量了。

  • 对结构体变量本身的引用:赋值运算

    只有两个变量是相同结构体类型才可以,成员之间一一对应赋值。

5. 结构体变量为数组的情况:略

6. 结构体变量为指针的情况

  • 定义:struct 结构体名 *指针变量名;
  • 初始化:结构体指针变量在使用之前必须进行初始化,其初始化的方式与基本数据类型指针变量的初始化相同,就是stu的首地址。如下:
struct student
{
    char name[10];
    char sex;
    struct date birthday;
    int age;
    float score;
}stu,*p=&stu;
  • 引用结构体指针变量:只讨论一种,如:stu->sex, stu->age;
  • 当该指针指向的是结构体数组时:
struct ucode
{
    char u1;
    int u2;
}tt[4],*p=tt;

  p指向的是tt[0]的首地址

7. 结构体与函数

  • 函数本身可以是结构体类型的,此时返回的值也必须是结构体类型的。
  • 函数的形参与实参传递之间可以是结构体变量,也可以是结构体指针变量。
  • 要想使函数有多个返回值,除了可以使用全局变量或者指针来解决,还可以是结构体类型返回值

 

二、共用体(联合体)

  由于这个时代的内存容量暴涨,目的是节约内存而存在的共用体技术已经显得不太重要了,所以,联合体目前实际上使用的并不多。(可能在单片机运用中得注意)

 

posted @ 2021-08-15 21:15  Pangenda  阅读(480)  评论(0)    收藏  举报