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

作者 : admin 本文共3619个字,预计阅读时间需要10分钟 发布时间: 2024-06-10 共2人阅读

定义和使用结构体变量

  • 介绍
  • 基础用法
    • 1.定义结构体
    • 2. 声明结构体变量
    • 3. 初始化和访问结构体成员
    • 4. 使用指针访问结构体成员
    • 5. 使用结构体数组
  • 高级用法
    • 6. 嵌套结构体
    • 7. 匿名结构体
    • 8. 结构体和动态内存分配
    • 9. 结构体作为函数参数
      • 按值传递
      • 按引用传递

介绍

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

基础用法

1.定义结构体

定义结构体的语法如下:

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

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

#include 

// 定义结构体
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 

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

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

输出结果:

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

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

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

#include 

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
", ptr_person->name);
    printf("Age: %d
", ptr_person->age);
    printf("Address: %s
", ptr_person->address);
    
    // 通过指针修改结构体成员
    ptr_person->age = 26;
    printf("Updated Age: %d
", ptr_person->age);
    
    return 0;
}

输出结果:
C语言:定义和使用结构体变量插图(1)

5. 使用结构体数组

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

#include 

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:
", i + 1);
        printf("  Name: %s
", people[i].name);
        printf("  Age: %d
", people[i].age);
        printf("  Address: %s
", people[i].address);
    }
    
    return 0;
}

输出结果:
C语言:定义和使用结构体变量插图(2)

高级用法

6. 嵌套结构体

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

#include 

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
", person1.name);
    printf("Age: %d
", person1.age);
    printf("Address: %s, %s, %s, %d
", 
           person1.address.street, 
           person1.address.city, 
           person1.address.state, 
           person1.address.zip);
    
    return 0;
}

输出结果:
C语言:定义和使用结构体变量插图(3)

7. 匿名结构体

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

#include 

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
", person1.name);
    printf("Age: %d
", person1.age);
    printf("Address: %s, %s, %s, %d
", 
           person1.address.street, 
           person1.address.city, 
           person1.address.state, 
           person1.address.zip);
    
    return 0;
}

输出结果:
C语言:定义和使用结构体变量插图(4)

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

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

#include 
#include  // 包含 malloc 和 free
#include 

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
");
        return 1;
    }
    
    // 初始化结构体成员
    strcpy(person1->name, "George");
    person1->age = 45;
    strcpy(person1->address, "789 Birch St");
    
    // 访问结构体成员
    printf("Name: %s
", person1->name);
    printf("Age: %d
", person1->age);
    printf("Address: %s
", person1->address);
    
    // 释放分配的内存
    free(person1);
    
    return 0;
}

输出结果:
C语言:定义和使用结构体变量插图(5)

9. 结构体作为函数参数

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

按值传递

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

#include 

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

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

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

输出结果:
C语言:定义和使用结构体变量插图(6)

按引用传递

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

#include 

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
", person1.age);
    
    updateAge(&person1, 60);
    printf("After update: Age = %d
", person1.age);
    
    return 0;
}

输出结果:
C语言:定义和使用结构体变量插图(7)

本站无任何商业行为
个人在线分享 » C语言:定义和使用结构体变量
E-->