「C系列」C 结构体

文章目录

  • 一、C 结构体
    • 1. 定义结构体
    • 2. 声明结构体变量
    • 3. 初始化结构体变量
    • 4. 访问结构体成员
    • 5. 结构体数组
    • 6. 结构体指针
    • 7. 结构体嵌套
  • 二、C 如何使用结构体
    • 1. 定义结构体类型
    • 2. 声明结构体变量
    • 3. 初始化结构体变量
    • 4. 访问结构体成员
    • 5. 结构体指针
    • 6. 在函数中使用结构体
    • 7. 注意事项
  • 三、相关链接

一、C 结构体

在C语言中,结构体(struct)是一种复合数据类型,它允许你将多个不同类型的数据项组合成一个单一的类型。结构体常用于表示具有多个相关属性的数据项,如一个学生的信息(包括学号、姓名、年龄等)。
在这里插入图片描述

1. 定义结构体

你可以使用 struct 关键字来定义一个新的结构体类型。例如,以下代码定义了一个名为 Student 的结构体,它包含学号(studentID)、姓名(name)和年龄(age)三个成员:

struct Student {
    int studentID;
    char name[50];
    int age;
};

2. 声明结构体变量

在定义了结构体类型之后,你可以声明该类型的变量。例如:

struct Student student1;

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

struct Student {
    int studentID;
    char name[50];
    int age;
} student1, student2; // 同时声明了student1和student2两个变量

3. 初始化结构体变量

你可以在声明时或稍后初始化结构体变量:

struct Student student1 = {12345, "Alice", 20}; // 声明并初始化

// 或者稍后初始化
struct Student student2;
student2.studentID = 67890;
strcpy(student2.name, "Bob"); // 注意:使用strcpy来复制字符串
student2.age = 22;

4. 访问结构体成员

使用点操作符(.)来访问结构体变量的成员:

printf("Student ID: %d\n", student1.studentID);
printf("Name: %s\n", student1.name);
printf("Age: %d\n", student1.age);

5. 结构体数组

你也可以声明结构体数组,以存储多个结构体实例:

struct Student students[3];

// 初始化结构体数组
students[0] = (struct Student){1, "Alice", 20};
strcpy(students[1].name, "Bob");
students[1].studentID = 2;
students[1].age = 22;
// ... 类似地初始化students[2]

6. 结构体指针

你还可以使用指针来访问结构体:

struct Student *pStudent = &student1;

// 使用指针访问结构体成员
printf("Name: %s\n", pStudent->name); // 注意使用->操作符来访问指针指向的结构体成员

7. 结构体嵌套

一个结构体也可以包含另一个结构体类型的成员:

struct Address {
    char street[100];
    char city[50];
    char country[50];
};

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

// 初始化并访问嵌套的结构体成员
struct Student student = {12345, "Alice", 20, {"123 Main St", "Springfield", "USA"}};
printf("Address: %s, %s, %s\n", student.address.street, student.address.city, student.address.country);

二、C 如何使用结构体

使用结构体(struct)在C语言中通常涉及定义结构体类型、声明结构体变量、初始化结构体变量、访问结构体成员等操作。以下是一个详细的使用结构体的示例:

1. 定义结构体类型

首先,你需要定义结构体类型。这可以通过struct关键字来完成。

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

// 定义一个名为Point的结构体类型,包含x和y两个整型成员
struct Point {
    int x;
    int y;
};

// 定义一个名为Rectangle的结构体类型,包含两个Point类型的成员(表示左上角和右下角)
struct Rectangle {
    struct Point topLeft;
    struct Point bottomRight;
};

2. 声明结构体变量

定义了结构体类型之后,你可以声明该类型的变量。

int main() {
    // 声明Point类型的变量p1和p2
    struct Point p1, p2;
    
    // 声明Rectangle类型的变量rect
    struct Rectangle rect;
    
    // ... 后续可以进行初始化等操作
    
    return 0;
}

3. 初始化结构体变量

在声明结构体变量之后,你可以进行初始化。

int main() {
    // ...

    // 使用设计初始化(C99及更高版本支持)
    struct Point p1 = {1, 2};
    struct Point p2 = {.y = 4, .x = 3}; // 成员可以按照任意顺序初始化
    
    // 初始化Rectangle类型的变量rect
    struct Rectangle rect = {{1, 1}, {5, 3}}; // 初始化topLeft和bottomRight成员
    
    // ...

    return 0;
}

4. 访问结构体成员

你可以使用点号(.)来访问结构体变量的成员。

int main() {
    // ... 初始化p1, p2, rect的代码 ...

    // 访问并打印Point结构体变量的成员
    printf("p1.x = %d, p1.y = %d\n", p1.x, p1.y);
    printf("p2.x = %d, p2.y = %d\n", p2.x, p2.y);
    
    // 访问并打印Rectangle结构体变量的成员
    printf("rect.topLeft.x = %d, rect.topLeft.y = %d\n", rect.topLeft.x, rect.topLeft.y);
    printf("rect.bottomRight.x = %d, rect.bottomRight.y = %d\n", rect.bottomRight.x, rect.bottomRight.y);
    
    // ...

    return 0;
}

5. 结构体指针

你还可以使用指针来访问结构体的成员。这在你需要动态分配内存或者需要传递结构体到函数时特别有用。

int main() {
    // ... 初始化p1, p2, rect的代码 ...

    // 声明结构体指针并使其指向rect
    struct Rectangle *pRect = &rect;
    
    // 使用指针访问结构体成员
    printf("pRect->topLeft.x = %d, pRect->topLeft.y = %d\n", pRect->topLeft.x, pRect->topLeft.y);
    // ... 类似地访问其他成员 ...
    
    return 0;
}

6. 在函数中使用结构体

结构体也可以作为函数的参数或返回值。

// 定义一个函数,它接受一个Rectangle类型的参数并打印其左上角和右下角的坐标
void printRectangle(struct Rectangle rect) {
    printf("TopLeft: (%d, %d)\n", rect.topLeft.x, rect.topLeft.y);
    printf("BottomRight: (%d, %d)\n", rect.bottomRight.x, rect.bottomRight.y);
}

int main() {
    // ... 初始化rect的代码 ...
    
    // 调用函数打印Rectangle的内容
    printRectangle(rect);
    
    return 0;
}

7. 注意事项

  • 结构体成员可以是任何数据类型,包括其他结构体类型。
  • 结构体变量之间可以通过赋值操作进行拷贝,但是这样做会拷贝整个结构体(包括所有成员)。
  • 结构体的大小取决于其成员的类型和数量,并且可能受到内存对齐的影响。
  • 使用结构体时,要确保不要越界访问其成员,特别是当结构体

三、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C系列」C 简介
  4. 「C系列」C 基本语法
  5. 「C系列」C 数据类型
  6. 「C系列」C 变量及常见问题梳理
  7. 「C系列」C 常量
  8. 「C系列」C 存储类
  9. 「C系列」C 运算符
  10. 「C系列」C 判断/循环
  11. 「C系列」C 函数
  12. 「C系列」C 作用域规则
  13. 「C系列」C 数组
  14. 「C系列」C enum(枚举)
  15. 「C系列」C 指针及其应用案例

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

utm投影

一 概述 UTM (Universal Transverse Mercator)坐标系是由美国军方在1947提出的。虽然我们仍然将其看作与“高斯&#xff0d;克吕格”相似的坐标系统&#xff0c;但实际上UTM采用了网格的分带&#xff08;或分块&#xff09;。除在美国本土采用Clarke 1866椭球体以外&#xff0c…

【仿真建模-anylogic】Port原理解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-14 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 类图 2. 原理解析 2.1 核心函数&#xff1a; Port作为各类型端口的基类&#xff0c;其核心方法如下 &#xff1a; 函数功能Port(A…

德国欧洲杯观战掌中宝

点击标题下「蓝色微信名」可快速关注 今天03:00&#xff0c;德国欧洲杯即将拉开帷幕&#xff0c;首战德国对阵苏格兰&#xff0c;24支欧洲国家队&#xff0c;分为6个小组&#xff0c;你是谁的拥趸&#xff1f; 本届欧洲杯的比赛时间有三个&#xff0c;分别是零点、凌晨三点和晚…

利用MongoDB构建现代支付系统|附《利用AI在支付领域的优势》报告下载

MongoDB 支付 通过实时整合和分析任何格式的数据 来丰富支付体验 为消费者提供增值服务和功能 丰富的支付体验 接受并丰富任何支付数据类型 使用灵活的文档数据模型实时整合和处理任何支付数据类型。JSON 文档&#xff08;与 MongoDB 使用的数据格式相同&#xff09;是支…

FPGA中复位电路的设计

复位电路也是数字逻辑设计中常用的电路&#xff0c;不管是 FPGA 还是 ASIC 设计&#xff0c;都会涉及到复位&#xff0c;一般 FPGA或者 ASIC 的复位需要我们自己设计复位方案。复位指的是将寄存器恢复到默认值。一般复位功能包括同步复位和异步复位。复位一般由硬件开关触发引起…

2024海南省大数据教师培训-Hadoop集群部署

前言 本文将详细介绍Hadoop分布式计算框架的来源&#xff0c;架构和应用场景&#xff0c;并附上最详细的集群搭建教程&#xff0c;能更好的帮助各位老师和同学们迅速了解和部署Hadoop框架来进行生产力和学习方面的应用。 一、Hadoop介绍 Hadoop是一个开源的分布式计算框架&…

仿element-ui 实现自己组件库 <3>

目录 input 组件封装 v-model用在组件上 显示和隐藏密码 封装switch组件 实现转换的功能 设置checkbox input 组件封装 首先input组件的基本框架和样式&#xff1a; <div class"miao-input"><input class"miao-input_inner" > </div…

Java | Leetcode Java题解之第151题反转字符串中的单词

题目&#xff1a; 题解&#xff1a; class Solution {public String reverseWords(String s) {StringBuilder sb trimSpaces(s);// 翻转字符串reverse(sb, 0, sb.length() - 1);// 翻转每个单词reverseEachWord(sb);return sb.toString();}public StringBuilder trimSpaces(S…

这份简历让一位程序员在谷歌获得30万美元

大家好&#xff0c;我是弗雷。每次都在让大家尝试走出职场&#xff0c;但今天我们却选择再次走进职场。 作为曾经的职场人&#xff0c;我深深明白简历的敲门砖作用&#xff0c;制作一份优质的简历至关重要。 你所见过的最优秀的简历是什么样子&#xff1f; 或者你想象中最优秀…

全息图分类及相位型全息图制作方法

全息图是一种光学器件&#xff0c;全息图分为振幅型和相位型全息图&#xff0c;振幅型全息图记录光的振幅信息即强度信息&#xff0c;相位型全息图记录光的相位信息&#xff0c;利用相位信息可以恢复光的波前形状&#xff0c;从而记录物体形状&#xff0c;这里主要介绍相位全息…

Java多线程面试重点-2

16.Synchronized关键字加在静态方法和实例方法的区别? 修饰静态方法&#xff0c;是对类进行加锁&#xff08;Class对象&#xff09;&#xff0c;如果该类中有methodA和methodB都是被Synch修饰的静态方法&#xff0c;此时有两个线程T1、T2分别调用methodA()和methodB()&#x…

深度学习与人工智能

深度学习&#xff0c;是一种特殊的人工智能&#xff0c;他与人工智能及机器学习的关系如下&#xff1a; 近些年来&#xff0c;基于人工神经网络的机器学习算法日益盛行起来&#xff0c;逐渐呈现出取代其他机器学习算法的态势&#xff0c;这主要的原因是因为人工神经网络中有一中…

AI 客服定制:LangChain集成订单能力

为了提高AI客服的问题解决能力&#xff0c;我们引入了LangChain自定义能力&#xff0c;并集成了订单能力。这使得AI客服可以根据用户提出的问题&#xff0c;自动调用订单接口&#xff0c;获取订单信息&#xff0c;并结合文本知识库内容进行回答。这种能力的应用&#xff0c;使得…

Android 13 高通设备热点低功耗模式(2)

前言 之前写过一篇文章:高通热点被IOS设备识别为低数据模式,该功能仿照小米的低数据模式写的,散发的热点可以达到被IOS和小米设备识别为低数据模式。但是发现IOS设备如果后台无任何网络请求的时候,息屏的状态下过一会,会自动断开热点的连接。 分析 抓取设备的热点相关的…

如何查找您的 SOLIDWORKS 序列号或许可证密钥

每个 SOLIDWORKS正版的软件都有自己的许可密钥&#xff0c;也称之为SOLIDWOKS的序列号。硕迪科技作为SOLIDKS正版软件代理商&#xff0c;我们的技术团队经常帮助客户查找他们的序列号。这篇文章将向您展示如何查找您的 SOLIDWORKS 序列号。 如果您拥有独立的 SOLIDWORKS 许可&…

碳化硅陶瓷膜良好的性能

碳化硅陶瓷膜是一种高性能的陶瓷材料&#xff0c;以其独特的物理和化学特性&#xff0c;在众多领域展现出了广泛的应用前景。以下是对碳化硅陶瓷膜的详细介绍&#xff1a; 一、基本特性 高强度与高温稳定性&#xff1a;碳化硅陶瓷膜是一种非晶态陶瓷材料&#xff0c;具有极高的…

[Vulnhub]Solid-State POP3邮件服务(James)+rbash逃逸

信息收集&SSH Server IP addressPorts Open192.168.8.100TCP:22,25,80,110,119,4555 Nmap 扫描: $ nmap -p- 192.168.8.100 --min-rate 1000 -sC -sV 结果: Host is up (0.00061s latency). Not shown: 65529 closed tcp ports (conn-refused) PORT STATE SERVICE…

Nacos启动报错

报错日志&#xff1a; Caused by: java.lang.NullPointerException at com.mysql.jdbc.ConnectionImpl.getServerCharset(ConnectionImpl.java:2983) at com.mysql.jdbc.MysqlIO.sendConnectionAttributes(MysqlIO.java:1873) at com.mysql.jdbc.Mysql…

Spring boot 启动报:Do not use @ for indentation

一、使用maven插件动态切换配置时出现报错 二、配置文件及pom 2.1 配置文件结构 2.2 application.yml spring: # 根据环境读取配置文件&#xff08;手动&#xff09; # profiles: # active: dev# 根据环境读取配置文件&#xff08;通过勾选maven插件&#xff09;profiles…

SAP Build 2-PDF数据提取与决策

0. 安装desktop agent 在后续过程中发现要预先安装desktop agent&#xff0c;否则没法运行自动化流程… 0.1 agent下载 参考官方文档说明 https://help.sap.com/docs/build-process-automation/sap-build-process-automation/create-user-in-rbsc-download-repository?loca…