初阶C语言-结构体

一.结构体的声明

1.结构体类型的声明

1.1结构的基础知识

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

 1.2结构的声明

struct tag        //struct是结构体关键字,tag是结构体类型名称
{
    member - list;//成员变量的列表
}variable - list;//变量列表

         为什么要学习结构体?之前学过的char、int、short、double等都是一些内置类型,我们用这些类型是无法表示一个复杂对象——人:姓名+性别+年龄+电话+地址...所以C语言引入了结构体来近似的描述上述人(对象)的特征。比方说我们要创建一个学生结构体,首先要声明学生类型,因为C语言规定利用类型创建变量(为啥变量要有类型?因为你得告诉内存你需要多大空间,int类型的变量就占4字节,char就占1字节),再把值存变量里->int a = 10。所以要先有学生这个类型,而要有学生这个类型,我们就需要声明一个结构体来做学生类型,再把创建一个学生类型的变量->

struct Student
{//学生的相关属性char name[20];int age;char sex[5];char tele[12];//...
};

        使用这个类型来创建变量,其实就是告诉内存我要申请多大空间来存我的复杂对象。 

struct Student
{//学生的相关属性char name[20];int age;char sex[5];char tele[12];//...
}s3, s4;int main()
{struct Student s1;struct Student s2;return 0;
}

        注意创建s1、s2变量的 方法别漏加struct(C语言中,struct Student才是类型名)。s1-s4都是结构体变量,两种创建方式都ok。差异是s3、s4是全局变量,s1和s2是局部变量。如果想偷懒省略掉可以使用typedef重定义类型名->

typedef struct Student
{//学生的相关属性char name[20];int age;char sex[5];char tele[12];//...
}Student;Student s3, s4;int main()
{Student s1;Student s2;return 0;
}

        注意:此时用struct Student来创建变量也可以,typedef之后,全局变量的形式就变成了上面那种,不能跟着写Student后面。

1.3结构体成员类型

        结构体成员可以是标量(基本数据类型——char,int,double等,不是复合数据类型——数组,结构体,联合体等)、数组、指针,甚至是其他结构体。

1.4结构体成员的定义与初始化

        定义(创建):

struct B
{char c;int i;
};struct S
{char c;int num;int arr[20];double* pd;struct B sb;struct B* pb;
};

        初始化(定义的同时给值): 

#include <stdio.h>struct B
{char c;int i;
};struct S
{char c;int num;int arr[20];double* pd;struct B sb;struct B* pb;
};int main()
{double d = 3.14;//按照顺序初始化struct S s3 = { 'q', 100, { 1, 2, 3}, &d, {'a', 99}, NULL };//记得包含头文件stdio.h//指定成员初始化struct S s4 = { .num = 1000, .arr = {1, 2, 3, 4, 5} };return 0;
}

         可以观察到s4里面未赋值到的成员是默认给0,s4要是一个成员都不初始化,那就是随机值,和数组的初始化是类似的。

 二.结构体成员的访问

        结构体变量的成员是通过点操作符.访问的,点操作符接受两个操作数,结构体变量.成员名还可以通过结构体指针的->,访问结构体指针->成员名。

#include <stdio.h>
#include <string.h>struct S
{char name[20];int age;
};void set_S(struct S t)
{t.age = 20;//t.name = "zhangsan";//这是错的,因为name是数组名,它是个地址常量strcpy(t.name, "zhangsan");//应该用字符串拷贝
}int main()
{struct S s = { 0 };//写一个函数给S存放数据set_S(s);return 0;
}

         能够发现结构体s并没有被赋值成功,那问题出在哪呢?因为传参的时候,用的是传值传参,形参是实参的一份临时拷贝,二者并不是同一块内存空间,所以结构体变量t被赋值完,出了函数,生命周期结束,跟s没啥关系。所以我们应该传址传参->

        既然Set_S()函数的参数用的是指针接受,那就可以用结构体指针->成员名来访问成员,简单直观明了。

         如果要实现一个打印结构体成员的函数,传值或者传址都是行的,因为我只是打印,不对数据做修改->

void Print_S(struct S t)
{printf("%s %d", t.age, t.name);
}

 

三.结构体传参

        在结构体成员访问那块,其实已经讲了结构体传参,当我们在打印的时候,有两种传参方式都是可以的,但是传指针的效率高一点,因为传值,要先生成一份拷贝,当结构体很大的时候,压栈的时间花销是很大的;而传指针,大小是4/8,时间和空间效率都很高。 所以结构体传参也最好使用传址传参。

void Print_S(struct S* t)
{printf("%s %d", t->name, t->age);
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

D26【python 接口自动化学习】- python 基础之判断与循环

day26 语句嵌套 学习日期&#xff1a;20241003 学习目标&#xff1a;判断与循环&#xfe63;-36 语句嵌套&#xff1a;如何处理多重嵌套的问题&#xff1f; 学习笔记&#xff1a; 语句嵌套的用途 在条件语句中使用另外一个条件语句 在循环中使用条件语句 多重循环 总结 1…

linux查看k8s的开机启动状态 systemctl is-enabled 查看开机启动状态

查看k8s的开机启动状态 在Kubernetes中&#xff0c;通常使用systemd来管理服务的启动。但是&#xff0c;Kubernetes节点上的服务可能不是由systemd直接管理&#xff0c;而是通过kubelet服务来管理。因此&#xff0c;检查Kubernetes节点的开机启动状态&#xff0c;你需要检查ku…

Unity网络开发 - C#开源网络通信库PESocket的使用

概述 在现代多人在线游戏中&#xff0c;稳定且高效的网络通信是确保游戏体验的关键。本文将探讨如何利用C#开源网络通信库PESocket来构建一个简单的Unity客户端与.NET控制台服务器之间的实时消息传递系统。通过本例&#xff0c;读者不仅能够了解PESocket的基本用法&#xff0c…

稀土抗紫外屏蔽剂的用途

稀土抗紫外屏蔽剂具有光、热稳定性好&#xff0c;可高效吸收/有效屏蔽280-400nm范围内的紫外线&#xff0c;无二次氧化过程的缺点&#xff0c;彻底解决产品因紫外线原因造成的变质和老化问题&#xff0c;并且具有添加量小、无毒、不易析出等优点。 稀土抗紫外屏蔽剂的用途只要有…

安全网络架构

网络安全解决方案是指通过一系列技术和措施来保护网络系统和数据的安全。它涉及多个方面&#xff0c;包括网络设备的防护、数据的加密和备份、安全策略的制定和执行等。以下是一些常见的网络安全解决方案&#xff1a; 防火墙&#xff1a;防火墙是一种硬件或软件设备&#xff0c…

qt+opengl 实现纹理贴图,平移旋转,绘制三角形,方形

1 首先qt 已经封装了opengl&#xff0c;那么我们就可以直接用了&#xff0c;这里面有三个函数需要继承 virtual void initializeGL() override; virtual void resizeGL(int w,int h) override; virtual void paintGL() override; 这三个函数是实现opengl的重要函数。 2 我们…

Leetcode 买卖股票的最佳时机

这段代码的目的是解决“买卖股票的最佳时机”这个问题&#xff0c;即在给定的股票价格数组中&#xff0c;找到一次买入和卖出所能获得的最大利润。 算法思想&#xff1a; 定义两个变量&#xff1a; minPrice: 这个变量用于记录迄今为止遇到的最小股票价格&#xff08;买入价格…

RandLA-Net 基于 Tensorflow , 训练自定义数据集

搭建 RandLA-Net 训练环境, 生成自定义训练数据集, 训练自定义数据集. Code: https://github.com/QingyongHu/RandLA-Net 搭建训练环境 Clone the repositorygit clone --depth=1 https://github.com/QingyongHu

初学java练习题【1】

import java.util.Scanner;public class HelloWorld{public static void main(String[] args){Scanner scannernew Scanner(System.in);//输入工资System.out.println("请输入您的工资&#xff1a;");double d1scanner.nextDouble();System.out.println("请输入…

npm运行时出现npm ERR! builtins is not a function报错!

项目场景&#xff1a; 项目运行时什么都没动都没改突然运行不起来了&#xff0c;报错 TypeError: builtins is not a function 代码什么都没动&#xff0c;不是代码问题&#xff0c;排查后只有可能是node和npm的问题&#xff0c;所以卸载掉node重装重启 解决方案&#xff1a; …

Python RabbitMQ 入门 pika

Python RabbitMQ 入门 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均…

前端的全栈之路:基于 Vue3 + Nest.js 全栈开发的后台应用

☘️ 项目简介 Vue3 Admin 是一个前端基于 Soybean Admin 二次开发&#xff0c;后端基于 Nest.js 的全栈后台应用&#xff0c;适合学习全栈开发的同学参考学习。 &#x1f341; 前端技术栈&#xff1a; Vue3.5、Ant Design Vue、UnoCSS、Pinia &#x1f341; 后端技术栈&…

小程序智能视频制作SDK解决方案,云端智能视频制作

无论是个人分享生活的点滴&#xff0c;还是企业展示品牌故事&#xff0c;一段精心制作的视频总能迅速抓住观众的眼球&#xff0c;传递无限价值。专业视频制作往往门槛较高&#xff0c;不仅需要专业的技能和设备&#xff0c;还耗费大量时间和精力。面对这一挑战&#xff0c;美摄…

jmeter入门: 安装

前提&#xff1a; 安装jdk1.8&#xff0c; 并设置java_home 和path环境变量。 ​​​​​​1. download Apache JMeter - Download Apache JMeter 2. 解压jmeter包 3. 安装插件Install :: JMeter-Plugins.org 下载jar包&#xff0c;放到lib/ext目录 4. 打开jmeter &#xff0…

wpf加载带材料的3D模型(下载的3D预览一样有纹理)

背景&#xff1a;最近真的是忙啊&#xff0c;累出汁水了 整体效果&#xff1a; 放大可以看清砖头&#xff1a; 1、需要自己准备好3D模型&#xff0c;比如我这里是下载的这里的3D Warehouse&#xff0c;下载Collada File格式文件 2、解压可以看到一个model.dae和材料的文件夹&…

科研绘图系列:R语言绘制SCI文章图2

文章目录 介绍加载R包导入数据图a图b图d系统信息介绍 文章提供了绘制图a,图b和图d的数据和代码 加载R包 library(ggplot2) library(dplyr) library(readxl) library(ggpmisc)导入数据 数据可从以下链接下载(画图所需要的所有数据): 百度网盘下载链接: https://pan.baid…

小猿口算APP脚本(协议版)

小猿口算是一款专注于数学学习的教育应用,主要面向小学阶段的学生。它提供多种数学练习和测试,包括口算、速算、应用题等。通过智能化的题目生成和实时批改功能,帮助学生提高数学计算能力。此外,它还提供详细的学习报告和分析,帮助家长和教师了解学生的学习进度和薄弱环节…

YOLOv11训练自己数据集_笔记1

一、前言 yolov11代码地址 分析YOLO11的关键改进点 YOLO11 相比之前版本&#xff0c;带来了五大关键改进&#xff1a; 增强特征提取&#xff1a;通过改进Backbone和Neck架构&#xff0c;新增了C3k2和C2PSA等组件&#xff0c;提升了目标检测的精度。 优化效率和速度&#xff1…

Java面试宝典-Java集合01

Java面试宝典-Java集合01 目录 Java面试宝典-Java集合01 1、Java中常用的集合有哪些&#xff1f; 2、Collection 和 Collections 有什么区别&#xff1f; 3、为什么集合类没有实现 Cloneable 和 Serializable 接口&#xff1f; 4、数组和集合有什么本质区别&#xff1f; 5、数组…

<Project-8.1.1 pdf2tx-mm> Python 调用 ChatGPT API 翻译PDF内容 历程心得

原因 用ZhipuAI&#xff0c;测试用的PDF里&#xff0c;有国名西部省穆斯林&#xff0c;翻译结果返回 “系统检测到输入或生成内容可能包含不安全或敏感内容&#xff0c;请您避免输入易产生敏感内容的提 示语&#xff0c;感谢您的配合” 。想过先替换掉省名、民族名等&#xff…