C语言初阶之结构体

news2024/11/15 22:20:11

在这里插入图片描述

结构体

  • 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. 结构体成员的访问

结构体变量访问成员
结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。
例如:

struct Stu
{
	char name[20];
	int age;
};

struct Stu s;

我们可以看到 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/709896.html

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

相关文章

小波变换笔记

突然变化的图像或信号 小波变换 高带宽? 放缩和时延 放缩因子和频率成正比 小波在频域中具有带通特性 Cf 中心频率 s 小波刻度 \delta t 采样间隔 时延 我们需要移动小波,以便使其和信号中寻找的特征对齐 时频分析时域频率成分滤波 连续小波变换 C…

【手撕算法|动态规划系列No.3】leetcode746. 使用最小花费爬楼梯

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

三相电机线电流上的锯齿状高频波形的来源

三相电机的线电流上会叠加有一组锯齿状波形,这里,光标可以看到它的频率:这是40KHz。当前线电流基频大约35 Hz。我们把变频器载波频率切至6.0,小的杂波频率变至60KHz: 所以,这类波形上的一级肉眼可见的杂波是…

时间序列分解 | Matlab经验模态分解(EMD)的信号分解

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列分解 | Matlab经验模态分解(EMD)的信号分解 部分源码 %----------------------

libevent实践09:交叉编译并运行定时器测试

交叉编译 执行命令: ./configure --prefix/big/libevent/libevent-2.1.12-stable/_arm_install --hostarm-linux-gnueabihf CC/arm-gcc/bin/arm-linux-gnueabihf-gcc CXX/arm-gcc/bin/arm-linux-gnueabihf-g --disable-openssl ./configure --prefix/big/libevent/…

GO 多线程工具使用和分析

GO 多线程工具使用和分析 Go 语言中的 sync 包提供了一些用于同步和互斥访问共享资源的原语,使用这些可以避免多个goroutine同时访问共享资源时出现的问题,他们有: 互斥锁读写锁condWaitGroupmaponcepoolatomic 本文介绍它们的使用方式 互…

【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 (数据集、事务、频繁项集、关联规则、支持度、置信度)

【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 (数据集、事务、频繁项集、关联规则、支持度、置信度) 目录 【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 (数据集、事务、频繁项集、关联规则、支持度、置信度&#x…

4、PCB设计快捷键与关键步骤

4、PCB设计快捷键与关键步骤 一、简介 1.1 常用快捷键: shiftc清除测量的结果,退出高亮。F2进入Board Insight查看板子的细节,相当于放大镜。q切换英制和米制。g切换移动的最小单位。L设置各层的颜色和显示选中元件,再按L是将元…

C#使用XML和Treeview结合实现复杂数据采集功能

一个项目的数据表暂时没有定下来,但是有了一些确定性:   1、比较复杂,可能变化;   2、大部分是选择项目,因为输入项目都差不多;   3、应用程序是C/S的窗体应用。   对于这样的用户需求,…

C++ 基础知识 面试题(一)

1.变量的声明与定义 声明:int x; //告诉编译器这个变量的类型和名称 定义:int x 0; //告诉编译器这个变量的类型和名称,为该变量分配内存空间,并初始化该变量 主要区别在于是否为变量分配内存空间 2.extern关键字 用法一&…

Apache IoTDB 论文入选数据库领域顶级学术会议 ACM SIGMOD

6 月 18-23 日,ACM SIGMOD 会议在美国西雅图举办。Apache IoTDB 的研究成果论文《Apache IoTDB: A Time Series Database for IoT Applications》在大会做了报告,并进行了 Poster 展示。 01 关于 SIGMOD SIGMOD 数据管理国际会议(Special Int…

嵌入式系统BSP开发(二)

快递拿到R16的开发板后,通过官方拿到SOCHIP的相关资料,压缩包的名称是lichee.tar.gz 一,解压相关的资料 tar xzvf r16_lichee.tar.gz 解压后得到的资料如下: yveyve:/data/home/yve/Linux/lichee$ ls brandy buildroot build…

计算物理专题:傅里叶变换与快速傅里叶变换

计算物理专题:傅里叶变换与快速傅里叶变换 傅里叶变换提供一个全新的角度去观察和描述问题,如在量子力学中,动量与坐标表象之间的变换就是傅里叶变换。傅里叶变换同意可以用在数据处理等领域。1965年,Cooley 和 Tukey 提出了快速傅…

redis之主从复制、哨兵、集群

文章目录 一、redis的高可用1.1 redis高可用的概念1.2 Redis的高可用技术 二、redis 主从复制2.1主从复制的原理2.2搭建Redis 主从复制 三、Redis 哨兵模式3.1搭建Redis 哨兵模式3.2启动哨兵模式3.3查看哨兵信息3.4故障模拟 四、Redis 群集模式4.1搭建Redis 群集模式 一、redis…

数据结构--串的定义和基本操作

数据结构–串的定义和基本操作 注:数据结构三要素――逻辑结构、数据的运算、存储结构(物理结构) 存储结构不同,运算的实现方式不同 \color{pink}存储结构不同,运算的实现方式不同 存储结构不同,运算的实现方式不同 串的定义 串 …

用Java制作简单的记事本

目录 前言 主界面设计 功能实现 打开 另存为 保存 查找 替换 成员变量 其他方法 警告弹窗 不移动光标更新文本框内容 源代码 总结 转载请注明出处,尊重作者劳动成果。 前言 考完试想写敲一下代码就写了一下这个程序,整个也是写了怎么久…

JavaEE语法第二章之多线程(初级一)

一、认识线程 1.1线程的概念 一个线程就是一个 "执行流"。每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 "同时"执行着多份代码。 一家公司要去银行办理业务,既要进行财务转账,又要进行福利发放,还得进行缴…

Docker常见问题集合

一、Docker安装 1、yum 安装 1)更新yum包到最新 yum update2)安装软件需要的软件,yum-util(提供 yum-config-manager 功能),device-mapper-persistent-data、lvm2(devicemapper 驱动依赖&…

mmdetection踩坑记录

1.mmcv-full和mmdetection的版本匹配问题 Readme里应该会给可复现的版本,一定要按照readme里的,这里是一些版本对应关系,像我的mmdet是2.3.0,我就只能装1.0.5的mmcv-full 表格来源:https://blog.csdn.net/qq_55957975/…

高频-测试岗面试题,软件测试面试常问面试题(付答案)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试流程&#xf…