C语言基础(十七)

C语言中的结构体(Struct)是一种用户自定义的数据类型,允许将不同类型的数据项组合成一个单一的类型:

测试代码1:

#include "date.h" 
#include <stdio.h>  
#include <string.h>  
// 定义结构体数组 
typedef struct {  
    int id;  
    char name[20];  
} Person;  
  
// 使用函数初始化Person结构体的函数  
void initPersonFunc(Person *p, int id, const char *name) {  
    p->id = id;  
    strcpy(p->name, name);  
}  
  
int main() {  
    int time = getTime();
    // 声明时初始化  
    Person people1[] = {  
        {1, "Alice"},  
        {2, "Bob"}  
    };  
  
    // 打印people1数组  
    printf("Using declaration initialization:\n");  
    for (int i = 0; i < 2; i++) {  
        printf("ID: %d, Name: %s\n", people1[i].id, people1[i].name);  
    }  
  
    // 使用循环或条件语句初始化  
    Person people2[3];  
    for (int i = 0; i < 3; i++) {  
        people2[i].id = i + 3; // 假设ID从3开始  
        sprintf(people2[i].name, "Charlie%d", i + 1); // 构造名字  
    }  
  
    // 打印people2数组  
    printf("\nUsing loop initialization:\n");  
    for (int i = 0; i < 3; i++) {  
        printf("ID: %d, Name: %s\n", people2[i].id, people2[i].name);  
    }  
  
    // 使用函数初始化  
    Person person3;  
    initPersonFunc(&person3, 101, "David");  
  
    // 打印person3  
    printf("\nUsing function initialization:\n");  
    printf("ID: %d, Name: %s\n", person3.id, person3.name);  
  
    return 0;  
}

运行结果如下:

测试代码2:

#include "date.h"
#include <stdio.h>  
#include <stdlib.h> 
#include <string.h> 
  
// 定义结构体  
typedef struct {  
    char name[50];  
    int age;  
} Person;  
  
int main() {  
    int time = getTime();
    // 创建结构体变量  
    Person person1 = {"Alice", 30};  
  
    // 创建一个指向结构体的指针,并将其初始化为指向person1  
    Person *ptr = &person1;  
  
    // 使用指针访问结构体成员  
    printf("Name: %s, Age: %d\n", ptr->name, ptr->age);  
  
    // 修改结构体成员的值  
    ptr->age = 31;  
  
    // 打印 
    printf("After modification: Name: %s, Age: %d\n", ptr->name, ptr->age);  
  
    // 使用动态内存分配  
    Person *person2 = (Person *)malloc(sizeof(Person));  
    if (person2 != NULL) {  
        strcpy(person2->name, "Bob");  
        person2->age = 25;  
  
        // 使用指针访问动态分配的结构体成员  
        printf("Dynamic Person: Name: %s, Age: %d\n", person2->name, person2->age);  
  
        // 释放动态分配的内存  
        free(person2);  
    }  
  
    return 0;  
}

运行结果如下:

测试代码3:

#include "date.h"
#include <stdio.h>  
#include <string.h>  
  
// 定义Phone结构体  
struct Phone {  
    char brand[50];  
    char model[50];  
    int year;  
};  
  
// 通过值传递打印Phone信息  
void printPhoneByValue(struct Phone phone) {  
    printf("通过值传递: Brand: %s, Model: %s, Year: %d\n", phone.brand, phone.model, phone.year);  
}  
  
// 通过指针传递更新Phone的年份并打印  
void updateAndPrintPhoneByPointer(struct Phone *phone, int newYear) {  
    phone->year = newYear; // 更新年份  
    printf("通过指针传递: Brand: %s, Model: %s, Year: %d\n", phone->brand, phone->model, phone->year);  
}  
  
// 确认Phone的状态  
void printPhoneAgainByPointer(struct Phone *phone) {  
    printf("再次确认通过指针传递后的状态: Brand: %s, Model: %s, Year: %d\n", phone->brand, phone->model, phone->year);  
}  
  
int main() {  
    int time = getTime();
    // 创建一个Phone结构体 
    struct Phone myPhone = {"Apple", "iPhone 12", 2020};  
  
    // 通过值传递打印Phone信息  
    printPhoneByValue(myPhone);  
  
    // 通过指针传递更新Phone的年份并打印  
    updateAndPrintPhoneByPointer(&myPhone, 2021);  
  
    // myPhone的年份更新  
    printPhoneAgainByPointer(&myPhone);  
  
    return 0;  
}

运行结果如下:

测试代码4:

#include <stdio.h>
#include <string.h>
#include "date.h"
#include <stdlib.h>

// 定义一个枚举类型
enum Brand { Apple, Samsung, Xiaomi, Huawei, Others };

// 定义一个结构体Phone
struct Phone {
    char model[50]; // 字符串,表示手机型号
    int year; // 整数,表示发布年份
    float screenSize; // 浮点数,表示屏幕尺寸
    double price; // 双精度浮点数,表示价格
    enum Brand brand; // 枚举类型,表示品牌
    char *color; // 字符指针,指向动态分配的颜色字符串
};

// 初始化手机结构体的函数
void initPhone(struct Phone *phone, const char *model, int year, float screenSize, double price, enum Brand brand, const char *color) {
    strcpy(phone->model, model);
    phone->year = year;
    phone->screenSize = screenSize;
    phone->price = price;
    phone->brand = brand;
    phone->color = strdup(color); // 使用strdup复制字符串,需要释放内存
}

// 释放颜色字符串占用的内存
void freePhone(struct Phone *phone) {
    free(phone->color);
}

// 打印手机信息的函数
void printPhone(const struct Phone *phone) {
    printf("Model: %s\n", phone->model);
    printf("Year: %d\n", phone->year);
    printf("Screen Size: %.2f inches\n", phone->screenSize);
    printf("Price: %.2f\n", phone->price);
    printf("Brand:");
    switch(phone->brand) {
        case Apple: printf("Apple\n"); break;
        case Samsung: printf("Samsung\n"); break;
        case Xiaomi: printf("Xiaomi\n"); break;
        case Huawei: printf("Huawei\n"); break;
        case Others: printf("Others\n"); break;
    }
    printf("Color: %s\n", phone->color);
}

int main() {
	int time = getTime();
    struct Phone myPhone;
    initPhone(&myPhone, "iPhone 12", 2020, 6.1, 999.99, Apple, "Space Gray");
    printPhone(&myPhone);
    freePhone(&myPhone); // 释放颜色字符串占用的内存
    return 0;
}

运行结果如下:

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值