C语言---初识结构体

news2024/11/15 9:05:09

1、结构体的声明

1.1、结构的基础知识

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

char、short、int、long、long、float、double是内置类型。

比如说,我们想要描述单一的成绩,身高我们直接用int类型就可以搞定了。

但是如果我想要描述人的特征,那这个就有点复杂,因为人包含:身高,性别,电话,名字等等信息。

书包含:书名,作者,定价,书号。

而针对此复杂对象的描述就需要用到结构体。

1.2、结构的声明

struct Peo
{
    char name[20];
    char tele[12];
    char sex[5];
    int high;
};

//或者下面的写法

struct Peo
{
    char name[20];
    char tele[12];
    char sex[5];
    int high;
}p1,p2;

//p1,p2是使用struct Peo结构体类型创建的2个变量/对象。
//并且p1,p2是全局变量。
//我们常说尽量不要创建全局变量,所以我们在使用struct Peo创建变量时,通常不这样创建。
//我们通常这样创建结构体变量(如下:)


int main()
{   
    struct Peo p1;   //结构体变量的创建
    return 0;
}	

1.3、结构成员类型

结构的成员可以是变量,数组,指针,甚至是其它结构体。

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

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

struct Point
{
    int x;
    int y;
}p1;        //全局变量p1 
struct Point p2;      //全局变量p2

int main()
{
    struct Point p3;              //局部变量p3;
    return 0;
}

初始化结构体变量:

#include <stdio.h>

struct Peo
{
    char name[20];
    char tele[12];
    char sex[5];
    int high;
};

int main()
{   
    struct Peo p1 = {"张三","12345678912","男",180};
    return 0;
}	

那如果是嵌套结构体初始化呢?并且读取值呢?

如下代码:

#include <stdio.h>

struct Peo
{
    char name[20];
    char tele[12];
    char sex[5];
    int high;
};

struct St           //新的结构体
{
    struct Peo p;       //嵌套一个结构体变量
    int num;
    float f;
};


int main()
{   
    struct Peo p1 = {"张三","12345678912","男",180};
    struct St s = {{"里斯","98765432101","女",169},12,3.14f};    //嵌套结构体初始化。
    printf("%s %s %s %d\n", p1.name, p1.tele, p1.sex, p1.high);
    printf("%s %s %s %d %d %f\n", s.p.name,s.p.tele,s.p.sex,s.p.high ,s.num, s.f);
    return 0;
}	

输出:

在这里插入图片描述

2、结构体成员的访问

2.1、使用. 操作符来访问结构体成员

此结构是:结构体对象.结构体成员变量,eg:结构体对象.结构体成员变量,eg:(*ps).name

2.2、使用->操作符来访问结构体成员变量

此结构是:结构体指针->结构体成员,eg:ps->name

#include <stdio.h>

struct Peo
{
    char name[20];
    char tele[12];
    char sex[5];
    int high;
};

void print(struct Peo* sp)
{
    printf("%s %s %s %d\n", sp->name, sp->tele, sp->sex, sp->high);
}

int main()
{   
    struct Peo p1 = {"张三","12345678912","男",180};
    print1(&p1);
    return 0;
}	

3、结构体传参

结构体传参有两种方式:

  • 传结构体对象本身,这样可以使用结构体对象.结构体成员变量的方法进行成员变量读取。
  • 传结构体对象的地址,这样可以使用结构体指针->结构体成员的方法进行成员变量读取。

我们想一想那个方法好呢?

是方法二:传结构体对象的地址好。具体原因:如果我们使用方法一:传结构体本身的话,前面说过,直接传结构体本身,形参知识实参的一份临时拷贝,如果大概这个结构体对象存储的数据非常之庞大时,拿在使用传结构体本身的话,优惠为形参拷贝一份如此庞大的数据,拿着空间和时间上会得不偿失。所以说使用方法二:传结构体对象的地址最好。

函数传参的时候,参数时需要压栈的。

如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。

结论:结构体传参时,要传结构体的地址。

直接上代码:

#include <stdio.h>

struct Peo
{
    char name[20];
    char tele[12];
    char sex[5];
    int high;
};

void print1(struct Peo* sp)    
{
    printf("%s %s %s %d\n", sp->name, sp->tele, sp->sex, sp->high);
}

void print2(struct Peo pp)    //pp形参是p1实参的临时拷贝
{
    printf("%s %s %s %d\n", pp.name, pp.tele, pp.sex, pp.high);
}


int main()
{
    struct Peo p1 = { "张三","12345678912","男",180 };
    print1(&p1);     //传入结构体地址
    print2(p1);     //传入结构体本身
    return 0;
}

输出:

在这里插入图片描述

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

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

相关文章

FPGA时序约束--基础理论篇

FPGA开发过程中&#xff0c;离不开时序约束&#xff0c;那么时序约束是什么&#xff1f;简单点说&#xff0c;FPGA芯片中的逻辑电路&#xff0c;从输入到输出所需要的时间&#xff0c;这个时间必须在设定的时钟周期内完成&#xff0c;更详细一点&#xff0c;即需要满足建立和保…

MokaPeople 上线 300 天:主打管理者视角和全员体验

当前&#xff0c;我们是身处的时代已从 VUCA 向 BANI 转变&#xff0c;在政策、经济和技术等多方面因素的驱动下&#xff0c;数字化转型已成为企业发展的必然趋势。 尤其在当下对于人才环境中的竞争态势也不得不迫使 HR 转型也进入了关键性的时刻。 6 月 2 日&#xff0c;国内…

TCP协议的相关特性

目录 TCP特点概要 TCP协议段格式 TCP原理 确认应答 超时重传 连接管理(三次握手,四次挥手) 三次握手 四次挥手 流水线传输 滑动窗口 滑动窗口ACK丢失 滑动窗口数据报丢失 流量控制 拥塞控制 延迟应答 停止等待协议 回退N帧协议 面向字节流 缓冲区 粘包问题 TCP异常 &…

手撕源码(三)ArrayList(JDK8)

目录 1.使用示例2.new ArrayList<>() 解析2.1 空列表2.2 默认大小的共享数组实例2.3 构造方法 3.new ArrayList<>(initialCapacity) 解析3.1 指定大小的共享数组实例3.2 构造方法 4.add() 解析4.1 容量大小4.2 add() 解析4.3 ensureCapacityInternal() 解析1&#…

【吴恩达GANs】【C1W4】Conditional Controllabel Generation

视频链接&#xff1a;吴恩达DeepLearning.ai之生成对抗网络&#xff08;GANS&#xff09;专业化〔Andrew Ng〕 4-2 Conditional generation intuition Unconditional Generation&#xff1a;从随机类中得到输出&#xff0c;每次输出的类也都是随机的&#xff0c;无法得到指定…

Redis和Mysql数据同步方案---延迟双删

一般场景下数据库和redis的同步机制&#xff1a; 针对有请求来读取数据库的场景&#xff1a; 但是如果有想要修改数据库内容的场景该怎么保持同步呢&#xff1f; 在我们访问redis时&#xff0c;redis中的数据可能不是热点数据&#xff0c;即此时数据库的更新操作已经完成&…

chatgpt赋能python:Python几行代码:打造高效SEO工具

Python几行代码&#xff1a;打造高效SEO工具 Python作为一种易用、可靠的编程语言&#xff0c;在数据处理、网页爬取等方面都有广泛应用。而对于SEO工作者来说&#xff0c;利用Python写几行简单的代码&#xff0c;可以帮助我们更高效地分析网站数据、监控关键词排名、抓取竞争…

测试工程师:“ 这锅我不背 ” ,如何回怼开发....?

前言 在一个周末的早餐我被同事小周叫出去跑步&#xff0c;本想睡个懒觉&#xff0c;但是看他情绪不太稳定的样子&#xff0c;无奈艰难爬起陪他去跑步。 只见她气冲冲的对着河边大喊&#xff1a;真是冤枉啊&#xff01;!&#xff01; 原来是在工作中被莫名其妙背锅&#xff0…

计算机存储体系

目录 一、基本概念 二、主存储器的基本组成 三、SRAM和DRAM 四、只读存储器ROM 五、主存储器与CPU的连接 六、双端口RAM和多模块存储器 七、磁盘存储器 八、固态硬盘SSD 九、Cache高速缓冲存储器 十、虚拟存储系统 一、基本概念 存储器的层次结构 主存——辅存&…

1_5 光流法计算VO(optical_flow)

采用特征点法做VO存在耗时较大的问题&#xff0c;一般耗时情况&#xff1a;如下 (1) 在图像中提取特征点并计算特征描述&#xff0c; 非常耗时 ~10ms ORB&#xff0c;shift耗时更多&#xff1b; (2) 在不同图像中寻找特征匹配&#xff0c; 非常耗时 …

centos上搭建以太坊私有链

第一步 安装go语言环境 root用户下新建一个soft目录(相关目录可以随意) 去golang官网找到链接&#xff0c;在soft目录下下载golang压缩包 wget --no-check-certificate https://go.dev/dl/go1.20.4.linux-amd64.tar.gz其中如果出现Unable to establish SSL connection.&am…

Redis持久化、主从与哨兵架构-02

RDB快照&#xff08;snapshot&#xff09; 在默认情况下&#xff0c; Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置&#xff0c; 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时&#xff0c; 自动保存一次 数据集…

QLoRA | 48G内存训练24小时,改进版4-bit量化技术微调650亿参数的模型达到chatgpt99.3%的效果

一、概述 title&#xff1a;QLORA: Efficient Finetuning of Quantized LLMs 论文地址&#xff1a;https://arxiv.org/pdf/2305.14314.pdf 代码&#xff1a;GitHub - artidoro/qlora: QLoRA: Efficient Finetuning of Quantized LLMs and https://github.com/TimDettmers/bi…

【搭建服务器】Python一行命令搭建HTTP服务器并外网访问

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 Python作为热度比较高的编程语言&#xff0c;其语法简单且语句清晰&#xff0c;而且python有…

Jetson AGX 安装 VScode 教程,适用于所有系统安装旧版本 VScode

最近使用Jetson AGX做项目&#xff0c;系统为Jetpack4.6&#xff0c;Ubuntu18.04版本&#xff0c;想装个VScode编辑代码&#xff0c;但是设备的内核是ARM 64架构&#xff0c;搜出来的是arrch64 直接在VScode官网上下载的arm版本deb安装包&#xff0c;无法安装&#xff0c;经过…

论文学习笔记:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

论文阅读&#xff1a;Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 今天学习的论文是 ICCV 2021 的 best paper&#xff0c;Swin Transformer&#xff0c;可以说是 transformer 在 CV 领域的一篇里程碑式的工作。文章的标题是一种基于移动窗口的…

【LeetCode】14,最长公共前缀。 难度等级:简单。知识点:字符串的大小比较(比较 ascii码的大小)

文章目录 一、题目二、我的解法&#xff1a;双指针逐个字符比较三、巧妙解法&#xff1a;字符串的字典序比较四、知识点&#xff1a;字符串的字典序比较 一、题目 二、我的解法&#xff1a;双指针逐个字符比较 双指针逐个字符比较是最容易想到的方法&#xff0c;但由于测试用例…

torch_scatter.scatter()的使用方法

学习目标&#xff1a; 在学习PyG时&#xff0c;遇到了 scatter 这个函数&#xff0c;经过学习加上自身的理解&#xff0c;记录如下以备复习 学习内容&#xff1a; src&#xff1a;表示输入的tensor&#xff0c;接下来被处理&#xff1b;index&#xff1a;表示tensor对应的索引…

【C++】C++11

文章目录 1、C11的简介2、 统一的列表初始化2-1、&#xff5b;&#xff5d;初始化2-2、std::initializer_list 3、声明3-1、auto3-2、decltype3-3、nullptr 4、范围for循环5、智能指针6、STL中一些变化6-1、STL新容器和容器新方法6-2、final和override 7、右值引用和移动语义7-…

【网络协议详解】——OSPF协议(学习笔记)

目录 &#x1f552; 1. 概述&#x1f552; 2. 相关概念&#x1f558; 2.1 基本思想&#x1f558; 2.2 区域及路由&#x1f558; 2.3 链路状态数据库&#x1f564; 2.3.1 点到点网络&#x1f564; 2.3.2 点到多点网络&#x1f564; 2.3.3 广播网络与非广播多址接入网络&#x1f…