Skip to content

struct

C 数组允许定义可存储相同类型数据项的变量,struct是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型 的数据项。

语法

c
struct tag{
    member_list1;
    member_list2;
    member_list3;
    ...
} variable_name

tag、member_list、variable_name三者至少出现2个才是合法的。

声明

  1. 分两步,先定义,后声明
c
struct InitMember
{
    int first;
    double second;
    char* third;
    float four;
};

struct InitMember test,test1;
  1. 定义时声明
c
struct InitMember
{
    int first;
    double second;
    char* third;
    float four;
} test,test1;
  1. 不写名称
c
struct
{
    int first;
    double second;
    char* third;
    float four;
} test,test1;

初始化

c
struct InitMember
{
    int first;
    double second;
    char* third;
    float four;
};
  1. 定义时赋值
c
struct InitMember test = {-10, 3.141590,"method one",0.25};
  1. .语法逐个赋值
c
struct InitMember test;
test.first = 1;
test.double = 1.1;
test.third = 'c';
test.four = 1.23;
  1. 定义时乱序赋值(C风格)
c
struct InitMember test = {
            .first=1,
            .second=1.1,
            .third="",
            .four= 1.23
    };

这种方法在Linux内核(kernel)中经常使用,在音视频编解码库FFmpeg中也大量频繁使用,还是很不错的一种方式。

  1. 定义时乱序赋值(C++风格)
c
struct InitMember test = { first: 1, second: 1.1, third: "123", four: 1.23};

成员的访问

为了访问结构的成员,我们使用成员访问运算符(.)

指向结构的指针

c
struct 结构体类型 *结构体变量名;

访问

c
struct Student {
    char name[10];
    int age;
};
  1. 通过取地址对应的结构体变量来访问成员变量
c
#include <stdio.h>

int main() {
    struct Student student = {"xiaoming", 23}, *p = &student;
    printf("%s\n", (*p).name);
    printf("%d", (*p).age);
    return 0;
}
  1. 通过->搭配指针变量访问成员变量
c
#include <stdio.h>

int main() {
    struct Student student = {"xiaoming", 23}, *p = &student;
    printf("%s\n", p->name);
    printf("%d", p->age);
    return 0;
}

拓展

  1. typedef添加别名简化类型声明
c
struct NodeList {
    ElementType value;
    struct NodeList *next;
};

// 在没有通过typedef定义别名时,每次声明一个struct NodeList类型的变量,都需要如此声明
struct NodeList nodeList;

// 添加了别名之后,便可以如此声明
typedef struct NodeList tag;

tag nodeList;

例如声明链表

c
typedef struct LNode {
    int data;
    struct LNode *next;
} LNode, *LinkList;

LNode是等价于LinkList的,为了代码可读性,表示节点时用LNode,表示变量是链表时用LinkList。

思维导图

img.png

img.png