[C语言] 结构体

news2025/1/10 23:53:40
结构体类型的声明
结构体初始化
结构体成员访问
结构体传参

目录

1. 结构体的声明

1.1 结构的基础知识

1.2 结构的声明

1.3 结构成员的类型

1.4 结构体变量的定义和初始化

2. 结构体成员的访问

3. 结构体传参


1. 结构体的声明

1.1 结构的基础知识

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

1.2 结构的声明

struct tag
{
         member - list ;
variable - list ;
例如描述一个学生:
typedef struct Stu
{
          char name [ 20 ]; // 名字
          int age ; // 年龄
          char sex [ 5 ]; // 性别
          char id [ 20 ]; // 学号
} Stu // 分号不能丢

1.3 结构成员的类型

结构的成员可以是标量、数组、指针,甚至是其他结构体。

1.4 结构体变量的定义和初始化

有了结构体类型,那如何定义变量,其实很简单。

struct Point
{
    int x;
    int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2

//初始化:定义变量的同时赋初值。

struct Point p3 = {x, y};

struct Stu        //类型声明
{
    char name[15];//名字
    int age;      //年龄
};
struct Stu s = {"zhangsan", 20};//初始化

struct Node
{
    int data;
    struct Point p;
    struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化

struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化

2. 结构体成员的访问

结构体变量访问成员
结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。
例如:
我们可以看到 s 有成员 name age
那我们如何访问 s 的成员?
struct S s;
strcpy(s.name, "zhangsan");// 使用 . 访问 name 成员
s.age = 20;// 使用 . 访问 age 成员
结构体指针访问指向变量的成员
有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。
那该如何访问成员。

如下:

struct Stu
{
    char name[20];
    int age;
};
void print(struct Stu* ps)
{
    printf("name = %s   age = %d\n", (*ps).name, (*ps).age);
   //使用结构体指针访问指向对象的成员
    printf("name = %s   age = %d\n", ps->name, ps->age);
}
int main()
{
   struct Stu s = {"zhangsan", 20};
   print(&s);//结构体地址传参
   return 0;
}

3. 结构体传参

直接上代码:
struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s);  //传结构体
print2(&s); //传地址
return 0;
}

上面的 print1 print2 函数哪个好些?

答案是:首选 print2 函数。
原因:
函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的
下降。
结论:
结构体传参的时候,要传结构体的地址。

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

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

相关文章

Windows系统管理一:操作系统概述

计算机系统的层次结构 五大基本功能 处理器管理 其工作主要是进程调度,在单用户单任务的情况下,必处理器仅为一个用户的一个任务所独占,进程管理的工作十分简单。但在多道程序或多用户的情况下,组织多个作业或任务时&#xff0c…

归并排序的递归和非递归实现

归并排序 平均时间复杂度O(n*logn),空间复杂度O(n) 递归实现 思路: 分治法 即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法 code: //递归版public st…

Linux 安装 JDK

要在Linux上安装JDK 1,按照以下步骤进行操作: 1. 下载JDK安装文件:首先,你需要找到适用于你操作系统的JDK安装文件(tar.gz或tar.bz2格式)。你可以从Oracle官方网站或其他可信的来源下载该文件。 2. 解压…

Unity 自制转表插件,高效便捷,无反射代码

XlsxTransverter Unity 高效转表工具 剔除了上一版本的反射用法 使用代码生成的 Decode方法来自解析 并与内存stream流保持一一对应 极大的提高了读表的访问速度 字段和字节流 保持一一对应 程序自动生成 decode方法 内存布局 Unity读表插件 https://github.com/badApple001/…

conda环境安装opencv带cuda版本

主要是cmake编译选项需要修改 以下两个选项按照自己情况修改 -D OPENCV_EXTRA_MODULES_PATH../opencv_contrib/modules \ -D CUDA_TOOLKIT_ROOT_DIR/usr/local/cuda-12.2 \ 其中/home/lixin/anaconda3/envs/stereo 改成你自己的conda环境 cmake -D CMAKE_BUILD_TYPER…

BUUCTF-WEB-[ACTF2020 新生赛]Includel

打开靶机 点击tips 利用Burp抓包,未见异常 但发现了响应头是 PHP/7.3.13 想到了"php://input"伪协议POST发送PHP代码 构建Payload:?filephp://filter/readconvert.base64-encode/resourceflag.php 这里需要注意的是使用php://filter伪协议…

PHP对接阿里云虚拟号的实现(号码隐私保护)

fastadmin 封装框架 实现功能:AXN隐私号绑定、解绑; 场景:为店铺手机号开通虚拟号,用户联系店铺展示虚拟号码; 官方开放文档地址:https://help.aliyun.com/document_detail/59655.html?spma2c4g.111742…

医院空调冷热源设计方案VR元宇宙模拟演练的独特之处

作为一个备受关注的技术-元宇宙,毋庸置疑的是,因为建筑本身契合了时尚、前卫、高端、虚拟、科幻、泛在、协作、互通等元素特征,因此在建筑行业更需要元宇宙,以居民建筑环境冷热源设计来说,元宇宙会打破既定的现实阻碍和…

【MySQL】MySQL 数据库基础

MySQL 数据库基础 一. 数据库的操作1. 显示当前的数据库2. 创建数据库3. 使用数据库4. 删除数据库 二. 常用数据类型1. 数据类型2. 字符串类型3. 日期类型 三. 表的操作1. 查看表结构2. 创建表4. 删除表 一. 数据库的操作 1. 显示当前的数据库 SHOW DATABASES;MySQL 不区分大…

PHP设备检验系统Dreamweaver开发mysql数据库web结构php编程计算机网页代码

一、源码特点 PHP设备检验系统是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88306259 php设备检验系统1 …

海康机器人工业相机IP设置方式

文章目录 一.什么情况下需要修改相机IP二.网口相机IP地址修改方式 一.什么情况下需要修改相机IP 二.网口相机IP地址修改方式

IO多路转接poll和epoll

文章目录 pollpoll和select的区别poll的底层实现方式什么是epollepoll执行原理epoll接口struct epoll_event是什么结构 epoll的两种触发方式epoll底层实现epoll总结 poll #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);参数&#xff1a; …

大数据(八):Pandas的基础应用详解(五)

专栏介绍 结合自身经验和内部资料总结的Python教程&#xff0c;每天3-5章&#xff0c;最短1个月就能全方位的完成Python的学习并进行实战开发&#xff0c;学完了定能成为大佬&#xff01;加油吧&#xff01;卷起来&#xff01; 全部文章请访问专栏&#xff1a;《Python全栈教…

MySQL表的CURD

CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; Create 语法 INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ... value_list: value, [, value] ... 示例&#x…

第 2 章 线性表(学生健康登记表实现)

1. 示例代码 1) status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H/* 函数结果状态码 */ #define TRUE 1 /* 返回值为真 */ #define FALSE 0 /* 返回值为假 */ #define RET_OK 0 /* 返回值正确 */ #define INFEASI…

Datax抽取mysql的bit类型数据

背景&#xff1a;使用datax抽取mysql的一张表&#xff0c;里面有两个bit类型的字段&#xff0c;抽取出来显示如下&#xff1a; 需要在抽取reader里面进行处理配置 最终生成的datax的json文件reader的配置会转换为具体的数值 最终查询效果&#xff1a;

python1图书点评推荐系统的设计与实现vue

本次设计任务是要设计一个图书点评网&#xff0c;通过这个系统能够满足用户对图书信息下载、收藏功能。系统的主要功能包括&#xff1a;首页、个人中心、用户管理、图书分类管理、图书信息管理、留言板管理、系统管理等功能。 管理员可以根据系统给定的账号进行登录&#xff0c…

新版edge浏览器读取谷歌浏览器上的历史记录

上一篇&#xff1a;(3条消息) 新版edge浏览器读取谷歌浏览器上的历史记录_learningbilibili的博客-CSDN博客https://blog.csdn.net/learningbilibili/article/details/123662218 关于上次的读取历史记录的问题是现在的edge浏览器最近的版本更新后出现了每次启动时从 Google Chr…

为IT服务台构建自定义Zia操作

Zia是manageengine的商业人工智能助手&#xff0c;是ServiceDesk Plus Cloud的虚拟会话支持代理。使用Zia&#xff0c;您可以优化帮助台管理&#xff0c;还可以缩小最终用户与其帮助台之间的差距&#xff0c;Zia通过执行预配置的操作来帮助用户完成他们的服务台任务。 例如&…

【Linux】线程池读写锁

文章目录 线程池应用场景线程池原理构造线程池代码实现 读写锁应用场景读写锁的三种状态读写锁的接口初始化接口销毁接口以读模式加锁以写模式加锁解锁接口 常见问题 乐观锁/悲观锁乐观锁悲观锁自旋锁 线程池 应用场景 线程池不仅要提高程序运行效率&#xff0c;还要提高程序…