Skip to content

结构体

概述

  • 有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性

    这时候可通过结构体实现

  • 结构体 (struct) 可以理解为用户自定义的特殊的复合的“数据类型”

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

  • 定义结构体变量的方式:

    先声明结构体类型再定义变量名

    在声明类型的同时定义变量

  • 语法格式:

    c
    // 先声明结构体类型再定义变量名
    struct 结构体名 {
        成员列表
    };
    struct 结构体名 变量名;
    
    // 在声明类型的同时定义变量
    struct 结构体名 {
        成员列表
    }变量名;
  • 示例代码:

    c
    // 结构体类型的定义
    struct stu {
        char name[50];
        int age;
    };
    
    // 先定义类型,再定义变量(常用)
    struct stu s1 = {"mike", 18};
    
    // 定义类型同时定义变量
    struct stu2 {
        char name[50];
        int age;
    }s2 = {"yoyo", 19};

结构体成员的使用

  • 如果是结构体变量,通过 . 操作成员
  • 如果是结构体指针变量,通过 -> 操作成功
c
#include <stdio.h>
#include <string.h>

// 结构体类型的定义
struct stu {
    char name[50];
    int age;
};

int main() {
    // 定义结构体变量,同时初始化
    struct stu s = {"mike", 18};
    // 打印成员变量
    printf("%s, %d\n", s.name, (&s)->age);
    // 修改成功变量的内容
    strcpy(s.name, "yoyo");
    s.age = 19;
    // 打印成员变量
    printf("%s, %d\n", s.name, (&s)->age);

    return 0;
}

结构体做函数参数

结构体值传参

传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量

示例代码:

c
#include <stdio.h>
#include <string.h>

// 结构体类型的定义
struct stu {
    char name[50];
    int age;
};

// 函数定义
void func(struct stu temp) {
    strcpy(temp.name, "yoyo");
    temp.age = 20;
    printf("函数内部:%s, %d\n", temp.name, temp.age);
}

int main() {
    // 定义结构体变量
    struct stu s = {"mike", 18};
    // 调用函数,值传递
    func(s);
    // 打印成员变量
    printf("函数外部:%s, %d\n", s.name, (&s)->age);

    return 0;
}

运行结果:

函数内部:yoyo, 20
函数外部:mike, 18

结构体地址传递

传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。

示例代码:

c
#include <stdio.h>
#include <string.h>

// 结构体类型的定义
struct stu {
    char name[50];
    int age;
};

// 函数定义
void func(struct stu *p) {
    strcpy(p->name, "yoyo");
    p->age = 20;
    printf("函数内部:%s, %d\n", p->name, p->age);
}

int main() {
    // 定义结构体变量
    struct stu s = {"mike", 18};
    // 调用函数,地址传递
    func(&s);
    // 打印成员变量
    printf("函数外部:%s, %d\n", s.name, (&s)->age);

    return 0;
}

运行结果:

函数内部:yoyo, 20
函数外部:yoyo, 20