C语言基础(十七)

news2024/11/9 9:52:25

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;
}

运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据分享】1999—2022年地级市市政公用事业和邮政、电信业发展情况相关指标(Shp/Excel格式)

在之前的文章中&#xff0c;我们分享过基于2000-2023年《中国城市统计年鉴》整理的1999-2022年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、一般公共预算收支状况、…

[NeurIPS 2024] Self-Refine: Iterative Refinement with Self-Feedback

Contents TL;DRReferences TL;DR 通过让 LLM 生成 feedback 不断 refine 自身的回答&#xff0c;可以提升回答效果&#xff0c;但也会带来不可忽视的推理开销 References Madaan, Aman, et al. “Self-refine: Iterative refinement with self-feedback.” Advances in Neura…

Openssl Infinite Loop 漏洞(CVE-2022-0778)

Openssl Infinite Loop 漏洞&#xff08;CVE-2022-0778&#xff09; 1. 漏洞详情 在该漏洞中由于证书解析时使用的 BN_mod_sqrt() 函数存在一个错误&#xff0c;它会导致在非质数的情况下永远循环。可通过生成包含无效的显式曲线参数的证书来触发无限循环。由于证书解析是在验…

word技巧:如何在Word中轻松实现文档内容的左右分栏排版

你是否曾遇到过需要让Word文档的内容更加整洁、易于阅读&#xff0c;却苦于不知如何将其巧妙分为左右两栏的困扰&#xff1f;别担心&#xff0c;今天我们就来详细解析这一实用技巧&#xff0c;让你的文档排版瞬间提升一个档次&#xff01; 方法如下&#xff1a; 首先&#xff0…

uniapp h5手机如何打开本地跑的前端项目进行本地调试

本地调试使用 vConsole是一个轻量级的移动端调试工具&#xff0c;可以在iOS设备上直接调试Uniapp H5应用。下面是具体的步骤&#xff1a; 在Uniapp项目中安装vConsole依赖&#xff1a;npm install vconsole。 在项目的main.js文件中引入vConsole库&#xff1a;import VConso…

python实现简单中文词元化、词典构造、时序数据集封装等

文章目录 简述代码词元化词典构造时序数据生成data.TensorDataset生成 简述 中文词元化、删除非中文字符、构建索引词典&#xff0c;以便于为训练提供向量化数据。 待处理文本&#xff0c;以朱自清的《背影》为例&#xff0c;图中是给句子手动换行了&#xff0c;不换也是没问…

【网络安全】服务基础第一阶段——第二节:网络测试与用户

一、Windows网络测试工具 CMD&#xff08;命令提示符&#xff09;中&#xff0c;ping和tracert是两个非常有用的网络诊断工具 1.1.ping命令 ping命令是Windows和其他操作系统中用于测试主机之间网络连接是否可达的基本命令行工具。它通过发送ICMP&#xff08;Internet Contr…

LLM agentic模式之规划能力(planning)

文章目录 任务分解分解优先方法交替分解方法 多计划选择外部规划器辅助规划反思和改进记忆增强规划评估 2024年2月的综述《 Understanding the planning of LLM agents: A survey》提供了基于LLM的的agent的规划(planning)能力的系统视角&#xff0c;总结了近年来提高规划能力…

如何申请 Midjourney API ,看这篇文章就够了

Midjourney Imagine API 的申请与应用 Midjourney&#xff0c;这一杰出的 AI 绘图工具&#xff0c;凭借输入几个关键字&#xff0c;便能在短短一两分钟内生成极为精美的图像&#xff0c;展现出令人惊叹的创作能力。它以独特的绘画技术在行业中独树一帜&#xff0c;现今在各个领…

墨刀基础篇(一) :6.常用组件(动态组件)

一&#xff1a;动态组件 动态组件是除了文件和矩形之外最重要的一个组件。文本和矩形是一切组件的基础&#xff0c;而动态组件是复杂组件的根本。动态组件就是可以拥有多个状态&#xff0c;每个状态可以放不同的内容&#xff0c;每个状态之间可以互相切换&#xff0c;每个状态…

springboot系列--springboot前置知识

一、spring相关知识 一、spring能干什么 二、spring生态 spring生态覆盖了&#xff1a;web开发、数据访问、安全控制、分布式、消息服务、移动开发、批处理等等。 官网链接&#xff1a;Spring | Home 二、springboot相关知识 一、springboot作用 Spring Boot makes it easy …

Ansys Rocky在电池制造行业应用

Ansys Rocky在电池制造行业应用 对于电池电极制造的理解 干湿混合应用 砑光应用 微尺度电极干燥应用 更多应用 材料生产 电极和电池生产

prolog 基础 - 关系和属性

首先进入环境&#xff1b; 看一下一开始的提示符是 ?- &#xff0c;现在可以用write语句输出一些东西&#xff1b; 根据资料&#xff0c;在prolog中&#xff0c; 两个对象之间的关系&#xff0c;使用括号表示。比如&#xff0c;jack的朋友是peter&#xff0c;写成friend(ja…

论文笔记:Large Language Models are Zero-Shot Next LocationPredictors

1 intro 下一个地点预测&#xff08;NL&#xff09;包括基于个体历史访问位置来预测其未来的位置。 NL对于应对各种社会挑战至关重要&#xff0c;包括交通管理和优化、疾病传播控制以及灾害响应管理NL 问题已经通过使用马尔可夫模型、基于模式的方法以及最近的深度学习&#x…

突破传统,GCOM80-2NET的创新性边缘计算方式

GCOM80-2NET边缘计算网关&#xff0c;突破传统Modbus协议仅能进行数据读采的限制&#xff0c;直接在设备终端进行复杂的数据点运算&#xff0c;减少冗余数据传输&#xff0c;释放软件人员针对不同Modbus设备协议解析的时间。 GCOM80-2NET&#xff0c;是ZLG致远电子推出的一款高…

OpManager Plus简单说明以及在Linux下的安装

目录 1 简介2 安装2.1 Linux下安装 1 简介 OpManager Plus 属于ManageEngine&#xff0c;是一款商业软件。 ManageEngine OpManager是一款全面的网络监视软件&#xff0c;可为网络管理员提供集成控制台&#xff0c;用于管理路由器&#xff0c;防火墙&#xff0c;服务器&#x…

免费个人网站怎么建立

一、选择免费网站建设平台 有许多免费的网站建设平台可供选择&#xff0c;如WordPress.com 、Wix、Weebly等。这些平台提供了易于使用的界面和模板&#xff0c;能够帮助用户快速创建个人网站博客网站 _ 网址大全 _ 博科趣 - 第2页博客网站大全,博客网址导航,个人独立博客,个人博…

Vue3项目开发——新闻发布管理系统(二)

文章目录 五、项目的目录调整六、系统整体路由设计开发1、系统整体路由分析2、路由配置2.1路由代码解析2.2路由信息设计2.3系统路由信息汇总2.4路由信息配置2.5路由对应Vue组件框架3系统效果五、项目的目录调整 默认生成的src目录结构如下: 这个结构不能满足我们的开发需求,…

Python测试框架之—— pytest介绍与示例

Pytest是一个功能强大且易于使用的Python测试框架&#xff0c;它提供了丰富的功能和灵活的用法&#xff0c;使得编写和运行测试变得简单而高效。 一、Pytest的特点 简单灵活&#xff1a;Pytest的语法简洁清晰&#xff0c;容易上手&#xff0c;并且支持复杂的测试场景。自动发…

为什么制造企业数字化转型需要MES管理系统

制造企业数字化转型需要MES管理系统&#xff0c;这主要源于MES管理系统在提升生产效率、优化资源配置、加强质量控制以及实现数据驱动决策等方面的显著优势。以下是具体的原因分析&#xff1a; 1. 提升生产效率 实时数据采集与分析&#xff1a;MES管理系统能够实时收集生产过程…