结构体

作者: 牧_青 | 来源:发表于2020-08-28 00:03 被阅读0次

  基本类型只能表示单一的类型,但是如果要表示复杂的场景,比如说表示学生,其中包含id,name,age这是就不能用某个基本类型来表示。为此,C语言引入了结构体的概念。

1、普通结构体的声明,定义和使用

1.1、声明

  在使用结构体之前,需要先声明它。一般形式为:

struct struct_name {
    类型说明符 成员名;        // 每个成员变量都有分号(;)作为结尾
    类型说明符 成员名;
    ...;
};         // 结构体最后用分号表示结束
# exam:
struct stu {
    int id;
    char *name;
    int age;
};

1.2、定义

  声明了结构体之后,系统并没有为这个结构体分配内存空间,如果需要对这个结构体进行赋值等运算,需要为这个结构体定义变量。
  定义结构体变量一般有三种方式:
   1. 先声明,再定义
   2. 声明的同时定义变量(包括结构体名称)
   3. 声明的同时定义变量(省略结构体名称)

# 先声明,在定义
struct stu {
    int id;
    char *name;
    int age;
};
struct stu student1, student2;   // 需要注意,此处struct不能省略

# 声明时直接定义变量(包括结构体名称)
struct stu {
    int id;
    char *name;
    int age;
} student1, student2;

# 声明时直接定义变量(省略结构体名称)
struct {
    int id;
    char *name;
    int age;
} student1, student2;     //注意这种和第二种的区别

  此外,可以直接使用宏定义#define使用一个符号常量来表示一个结构体类型,其用法也和上面类似。

#define Stu struct stu
Stu {
    int id;
    char *name;
    int age;
};
Stu student1, student2;

1.3、使用

  c语言通常不会讲一个结构体变量当成一个完成的变量来使用,除了允许相同类型的结构体相互赋值之外,对其的赋值,输入,输出, 运算等都是通过结构体成员变量来实现的(所以别老想着像go语言一样对结构体整个输出)。

1.3.1、成员表示

  结构体成员的表示通常有两种方式:
  1. 结构体变量名.成员名
  2. 结构体指针->成员名

student1.id = 1;
student2.id = 2;

1.3.2、结构体变量赋值

  如前所说,除了类型相同的结构体之间可以相互赋值外,结构体的赋值操作都是通过结构体的成员变量来实现的。除此之外,结构体变量在定义的时候可以进行整体赋值。
  所以说,结构体变量赋值有三种:
  1. 针对结构体的每个成员变量进行赋值
  2. 对于相同结构体,可以直接相互赋值
  3. 结构体变量如果在定义时赋值,可以进行整体赋值(需要注意,如果先定义,再赋值,就不能进行整体赋值)

struct stu {
    int id;
    char *name;
    int age;
} student1, student2, student3 = {3, "xiaohong", 18};  //  声明时定义变量进行整体赋值
// 针对每个成员变量进行赋值
student1.id = 1;
student1.name = "xiaoming";
student1.age = 18;

// 相同结构体变量之间进行赋值
student2 = student1;

// 定义变量时进行赋值
stu student4 = {4, "xiaolan", 18};
// 需要注意,以下做法是错误的
// stu student5
// student5 = {5, "xiaohuang", 18};   //error: expected expression   student5 = {5, "xiaohuang", 18}; 

1.4、结构体数组

  数组的元素也可以是结构体类型,用来表示相同数据结构的一个群体。
  结构体数组的定义方式和结构体变量定义相似,只需要说明它是数据类型即可。

struct {
    int id;
    char *name;
    int age;
}student[2]= {
    {1, "xiaoming", 18};
    {2, "xiaohuang", 18};
};    //此处如果对数组中的所有成员赋值,也可不给出数组长度。

留坑待填~

1.5、结构体指针

1.5.1、指向结构体的指针

1.5.2、结构体指针作为函数参数

1.6、动态分配存储

l

相关文章

  • 结构体

    [toc] 结构体的定义方式 先定义结构体类型,再定义结构体变量 定义结构体类型的同时定义结构体变量 定义结构体类...

  • 【C语言笔记】<十九>结构体

    结构体的基本概念 结构体初始化 结构体的内存存储细节 结构体定义的方式 结构体类型的作用域 指向结构体的指针 结构...

  • C结构体和链表

    一,结构体变量定义及初始化 二,无名结构体 备注:无名结构体很少使用 三,宏定义结构体 四,结构体嵌套 五,结构体...

  • 结构体

    结构体定义* 结构体中的格式:* struch 结构体名* {* 结构体成员变量* }* 结构体中的特点* 1.结...

  • 结构体数组的定义

    结构体数组的定义 1、先定义结构体类型,再定义结构体数组 2、定义结构体类型的同时定义结构体数组 3、省略结构体类...

  • C#结构体,析构方法,跨程序访问

    结构体 结构体定义 结构体的语法格式: struct + 结构体名 { 结构体成员变量(相当于类中的字段) } 结...

  • 结构体

    结构体有名定义 无名定义 结构体嵌套定义 结构体内存对齐 结构体成员初始化 结构体变量引用 结构体的有名定义:直白...

  • 菜鸡学Swift3.0 13.结构体

    结构体 struct 是值类型 1.定义结构体 struct 结构体类型 { var 结构体属性:类型 ...} ...

  • 结构体

    结构体初识 结构体指针 结构体的匿名字段 结构体嵌套 Go语言中的OOP

  • C语言 第九章 结构体

    [TOC] 第九章结构体 结构体的定义 结构体定义2 指针表示结构体

网友评论

      本文标题:结构体

      本文链接:https://www.haomeiwen.com/subject/cuihsktx.html