C语言:定义和使用结构体变量

介绍

在C语言中,结构体(struct)是一种用户定义的数据类型,它允许我们将不同类型的数据组合在一起。结构体对于处理相关联的数据非常有用,比如将一个人的姓名、年龄和地址组合在一起。

基础用法

1.定义结构体

定义结构体的语法如下:

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

例如,我们可以定义一个表示人的结构体:

#include <stdio.h>

// 定义结构体
struct Person {
    char name[50];
    int age;
    char address[100];
};

2. 声明结构体变量

在定义了结构体之后,我们可以声明结构体变量:

// 声明结构体变量
struct Person person1;

我们也可以在定义结构体时同时声明结构体变量:

struct Person {
    char name[50];
    int age;
    char address[100];
} person1, person2;

3. 初始化和访问结构体成员

我们可以使用点运算符(.)来访问和赋值结构体的成员:

#include <stdio.h>

struct Person {
    char name[50];
    int age;
    char address[100];
};

int main() {
    // 声明并初始化结构体变量
    struct Person person1 = {"Alice", 30, "123 Main St"};
    
    // 访问结构体成员
    printf("Name: %s\n", person1.name);
    printf("Age: %d\n", person1.age);
    printf("Address: %s\n", person1.address);
    
    // 修改结构体成员
    person1.age = 31;
    printf("Updated Age: %d\n", person1.age);
    
    return 0;
}

输出结果:

在这里插入图片描述

4. 使用指针访问结构体成员

我们还可以通过指针访问结构体成员,使用箭头运算符(->):

#include <stdio.h>

struct Person {
    char name[50];
    int age;
    char address[100];
};

int main() {
    struct Person person1 = {"Bob", 25, "456 Elm St"};
    struct Person *ptr_person = &person1;
    
    // 使用指针访问结构体成员
    printf("Name: %s\n", ptr_person->name);
    printf("Age: %d\n", ptr_person->age);
    printf("Address: %s\n", ptr_person->address);
    
    // 通过指针修改结构体成员
    ptr_person->age = 26;
    printf("Updated Age: %d\n", ptr_person->age);
    
    return 0;
}

输出结果:
在这里插入图片描述

5. 使用结构体数组

有时候我们需要处理多个相同类型的结构体变量,这时可以使用结构体数组:

#include <stdio.h>

struct Person {
    char name[50];
    int age;
    char address[100];
};

int main() {
    // 定义结构体数组
    struct Person people[2] = {
        {"Charlie", 22, "789 Maple St"},
        {"Dana", 28, "101 Oak St"}
    };
    
    for (int i = 0; i < 2; i++) {
        printf("Person %d:\n", i + 1);
        printf("  Name: %s\n", people[i].name);
        printf("  Age: %d\n", people[i].age);
        printf("  Address: %s\n", people[i].address);
    }
    
    return 0;
}

输出结果:
在这里插入图片描述

高级用法

6. 嵌套结构体

结构体可以包含其他结构体作为它的成员,这称为嵌套结构体。嵌套结构体可以帮助我们创建更加复杂的数据结构。

#include <stdio.h>

struct Address {
    char street[100];
    char city[50];
    char state[20];
    int zip;
};

struct Person {
    char name[50];
    int age;
    struct Address address; // 嵌套结构体
};

int main() {
    struct Person person1 = {"Emily", 35, {"123 Oak St", "Springfield", "IL", 62704}};
    
    printf("Name: %s\n", person1.name);
    printf("Age: %d\n", person1.age);
    printf("Address: %s, %s, %s, %d\n", 
           person1.address.street, 
           person1.address.city, 
           person1.address.state, 
           person1.address.zip);
    
    return 0;
}

输出结果:
在这里插入图片描述

7. 匿名结构体

在某些情况下,我们可以使用匿名结构体来简化代码。匿名结构体没有名字,可以直接使用。

#include <stdio.h>

struct Person {
    char name[50];
    int age;
    struct {
        char street[100];
        char city[50];
        char state[20];
        int zip;
    } address; // 匿名结构体
};

int main() {
    struct Person person1 = {"Frank", 40, {"456 Pine St", "Riverdale", "NY", 10567}};
    
    printf("Name: %s\n", person1.name);
    printf("Age: %d\n", person1.age);
    printf("Address: %s, %s, %s, %d\n", 
           person1.address.street, 
           person1.address.city, 
           person1.address.state, 
           person1.address.zip);
    
    return 0;
}

输出结果:
在这里插入图片描述

8. 结构体和动态内存分配

在处理大型数据集或需要动态创建结构体时,可以使用动态内存分配(如mallocfree)。

#include <stdio.h>
#include <stdlib.h> // 包含 malloc 和 free
#include <string.h>

struct Person {
    char name[50];
    int age;
    char address[100];
};

int main() {
    // 动态分配内存给结构体
    struct Person *person1 = (struct Person *)malloc(sizeof(struct Person));
    
    if (person1 == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }
    
    // 初始化结构体成员
    strcpy(person1->name, "George");
    person1->age = 45;
    strcpy(person1->address, "789 Birch St");
    
    // 访问结构体成员
    printf("Name: %s\n", person1->name);
    printf("Age: %d\n", person1->age);
    printf("Address: %s\n", person1->address);
    
    // 释放分配的内存
    free(person1);
    
    return 0;
}

输出结果:
在这里插入图片描述

9. 结构体作为函数参数

结构体可以作为函数的参数传递。传递结构体有两种方式:按值传递和按引用传递。

按值传递

按值传递会复制整个结构体,因此函数内部的修改不会影响原始结构体。

#include <stdio.h>

struct Person {
    char name[50];
    int age;
};

void printPerson(struct Person p) {
    printf("Name: %s\n", p.name);
    printf("Age: %d\n", p.age);
}

int main() {
    struct Person person1 = {"Helen", 50};
    printPerson(person1);
    return 0;
}

输出结果:
在这里插入图片描述

按引用传递

按引用传递通过传递指针,可以修改原始结构体。

#include <stdio.h>

struct Person {
    char name[50];
    int age;
};

void updateAge(struct Person *p, int newAge) {
    p->age = newAge;
}

int main() {
    struct Person person1 = {"Ivy", 55};
    printf("Before update: Age = %d\n", person1.age);
    
    updateAge(&person1, 60);
    printf("After update: Age = %d\n", person1.age);
    
    return 0;
}

输出结果:
在这里插入图片描述

相关推荐

  1. C语言 如何定义使用结构

    2024-06-10 09:54:01       42 阅读
  2. C语言-----自定义类型-----结构

    2024-06-10 09:54:01       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-10 09:54:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-10 09:54:01       102 阅读
  3. 在Django里面运行非项目文件

    2024-06-10 09:54:01       83 阅读
  4. Python语言-面向对象

    2024-06-10 09:54:01       92 阅读

热门阅读

  1. 1341. 电影评分

    2024-06-10 09:54:01       40 阅读
  2. 如何学好量子计算机技术的两种思路

    2024-06-10 09:54:01       28 阅读
  3. 爬山算法详细介绍

    2024-06-10 09:54:01       47 阅读
  4. 4. 流程控制语句

    2024-06-10 09:54:01       35 阅读
  5. vscode 好用的插件

    2024-06-10 09:54:01       34 阅读
  6. 23种设计模式——创建型模式

    2024-06-10 09:54:01       34 阅读
  7. 2024年6月10日--6月16日(渲染+ue独立游戏)

    2024-06-10 09:54:01       36 阅读
  8. Terminal Multiplexer的使用

    2024-06-10 09:54:01       40 阅读
  9. 什么情况下需要用到动态IP

    2024-06-10 09:54:01       36 阅读