初阶C语言-结构体

在这里插入图片描述

🌞 “少年有梦不至于心动,更要付诸行动。” 今天我们一起学习一下结构体的相关内容!

结构体

  • 🎈1.结构体的声明
    • 1.1结构的基础知识
    • 1.2结构的声明
    • 1.3结构成员的类型
    • 1.4结构体变量的定义和初始化
  • 🎈2.结构体成员的访问
    • 2.1结构体变量访问成员
    • 2.2结构体指针访问指向变量的成员
  • 🎈3.结构体传参

🎈1.结构体的声明

1.1结构的基础知识

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

1.2结构的声明

📝为什么会出现结构体呢?在我们当前的一些学习中,我们学过的类型都是内置类型,例如:char short int double 等等。但是,它们无法描述一个复杂的对象,比方说人,我们很难用一个类型描述出它。相反,我们可能需要通过性别、年龄、身高、体重等等来进行描述。
🧩对于结构体的声明,格式如下:

struct tag
{member-list;//成员变量的列表
}variable-list;//变量列表

📖下面,给出一个学生的结构体的声明:

struct Stu//struct是结构体的关键字
{//学生的相关属性char name[20];//姓名int age;//年龄char sex[5];//性别char tele[12];//电话
}s3,s4;
//s3,s4是结构体类型的变量,但是s3,s4是全局变量。
int main()
{struct Stu s1;struct Stu s2;//s1,s2也是结构体类型的变量,但是是局部变量return 0;
}

在这里插入图片描述
🔎这里的话,可能有的同学在想,如果每次在主函数内来定义一个结构体变量都要加struct Stu是不是太麻烦了,能不能把这个去掉呢,或者说有没有更简单的表达方法呢?我们这个时候,就需要用到typedef(typedef顾名思义是类型定义的,这里理解为类型重命名。链接: 关于关键字讲解的链接)那么,程序可以做以下修改:

typedef struct Stu//struct是结构体的关键字
{//学生的相关属性char name[20];//姓名int age;//年龄char sex[5];//性别char tele[12];//电话
}Stu;//Stu是重命名产生的新的类型
int main()
{Stu s1;Stu s2;//s1,s2是结构体类型的变量return 0;
}

1.3结构成员的类型

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

struct B
{int a;short b;
};
struct C
{char c;int num;int arr[10];double* p;struct B b;struct B* p;
};

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

🧩结构体变量的定义:

struct A
{int age;char sex;
}a1;//a1是全局变量
struct A a2;//a2也是全局变量
int main()
{struct A a3;//局部变量return 0;
}

📖当我们想要给这些变量一些值的时候,我们就需要对变量进行初始化:

struct A
{int age;char sex;int arr[10];
}a1;//a1是全局变量
struct A a2;//a2也是全局变量
int main()
{//对于结构体的初始化可以用一对大括号来进行//按照顺序初始化struct A a3 = { 18,'M',{1,2,3,4,5,6,7,8,9,10} };//局部变量//给指定的成员初始化struct A a4 = { .age = 20,.arr = {6,6,6} };return 0;
}

🔎我们可以通过监视来看看变量初始化的情况:
在这里插入图片描述

🎈2.结构体成员的访问

2.1结构体变量访问成员

📖结构变量的成员通过点操作符(.)访问的,点操作符要接受两个操作数。

下面我们给出示例,带大家了解一下:

#include <stdio.h>
#include <string.h>
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A t)
{t.age = 10;//t.name = "zhangsan";//这里我们发现会报错,因为name是数组名,数组是常量的地址,不能改变,这里我们就需要用到strcpy函数来进行拷贝strcpy(t.name, "zhangsan");//字符串拷贝t.sex = 'M';
}
int main()
{struct A a = { 0 };//写一个函数给a中存放数据Set_a(a);return 0;
}

🔎我们上面这段代码对不对呢?变量a是否被初始化了呢?这里,我们调试着看一看:
在这里插入图片描述
🧩我们发现a并没有被初始化,这是为什么呢?

注意:实参传递给形参的时候,形参是实参的一份临时拷贝,对形参的修改不会影响实参❗

🎈通过前面的学习,我们知道这里应该通过传地址的方式来改变实参的值:

#include <stdio.h>
#include <string.h>///strcpy函数的头文件
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A *t)
{(*t).age = 10;//t.name = "zhangsan";//这里我们发现会报错,因为name是数组名,数组是常量的地址,不能改变,这里我们就需要用到strcpy函数来进行拷贝strcpy((*t).name, "zhangsan");//字符串拷贝(*t).sex = 'M';
}
int main()
{struct A a = { 0 };//写一个函数给a中存放数据Set_a(&a);return 0;
}

在这里插入图片描述
🌞同样的,既然这里我们用到了指针,不妨可以用指针访问指向变量的成员!

2.2结构体指针访问指向变量的成员

📖通过结构体指针来访问成员可以通过操作符->来实现。

🧩上述代码可以做以下修改,结果相同:

#include <stdio.h>
#include <string.h>
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A* t)
{t->age = 10;strcpy(t->name, "zhangsan");//字符串拷贝t->sex = 'M';
}
int main()
{struct A a = { 0 };//写一个函数给a中存放数据Set_a(&a);return 0;
}

在这里插入图片描述

🎈3.结构体传参

#include <stdio.h>
struct B
{int date[100];int num;
};
struct B b = { {1,2,3},12 };
void Print1(struct B b)
{printf("%d\n", b.num);
}
void Print2(struct B *b)
{printf("%d\n", b->num);
}
int main()
{Print1(b);Print2(&b);return 0;
}

在这里插入图片描述

🔎对于上面两个函数Print1和Print2,用哪个更好呢?这里我们选择函数Print2
注:函数传参的时候,参数是需要压栈的❗如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降!
❤️结论:结构体传参的时候,要传结构体的地址!

好啦,关于结构体的知识点到这里就结束啦,后期会继续更新C语言的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️

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

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

相关文章

自然语言处理从入门到应用——LangChain:记忆(Memory)-[自定义对话记忆与自定义记忆类]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 自定义对话记忆 本节介绍了几种自定义对话记忆的方法&#xff1a; from langchain.llms import OpenAI from langchain.chains import ConversationChain from langchain.memory import ConversationBufferMemoryllm…

QT 使用第三方库QtXlsx操作Excel表

1.简介 一直以来&#xff0c;都想学习一下C/C如何操作excel表&#xff0c;在网上调研了一下&#xff0c;觉得使用C/C去操作很麻烦&#xff0c;遂转向QT这边&#xff1b;QT有一个自带的类QAxObject&#xff0c;可以使用他去操作&#xff0c;但随着了解的深入&#xff0c;觉得他…

c++游戏制作指南(四):c++实现数据的存储和读取(输入流fstream)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到静渊隐者的csdn博文&#xff0c;本文是c游戏制作指南的一部&#x1f35f; &#x1f355;更多文章请点击下方链接&#x1f355; &#x1f368; c游戏制作指南&#x1f3…

最长重复子数组(力扣)动态规划 JAVA

给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。 示例 2&#xff1a; 输…

新宝马M5谍照曝光,侵略感十足,将与奥迪、梅赛德斯-AMG正面竞争

报道称&#xff0c;宝马即将推出全新一代M5&#xff0c;该车的谍照最近再次曝光。早先&#xff0c;宝马 M5 Touring 旅行汽车的赛道测试图片已经在网络上流传开来&#xff0c;预计该车将与奥迪的RS6 Avant和梅赛德斯-AMG E63 Estate展开正面竞争。 从最新曝光的照片来看&#x…

【操作系统考点汇集】操作系统考点汇集

关于操作系统可能考察的知识点 操作系统基本原理 什么是操作系统&#xff1f; 操作系统是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff0c;以提供给用户和它软件方便的接口和环境&#xff0c;是计算机系统中最基…

Python土力学与基础工程计算.PDF-钻探泥浆制备

Python 求解代码如下&#xff1a; 1. rho1 2.5 # 黏土密度&#xff0c;单位&#xff1a;t/m 2. rho2 1.0 # 泥浆密度&#xff0c;单位&#xff1a;t/m 3. rho3 1.0 # 水的密度&#xff0c;单位&#xff1a;t/m 4. V 1.0 # 泥浆容积&#xff0c;单位&#xff1a;…

神经网络基础-神经网络补充概念-53-将batch norm拟合进神经网络

代码实现 import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, BatchNormalization, Activation from tensorflow.keras.optimizers import SGD# 生成随机数据 np.random.seed(0) X np.…

【0基础入门Python笔记】一、python 之基础语法、基础数据类型、复合数据类型及基本操作

一、python 之基础语法、基础数据类型、复合数据类型及基本操作 基础语法规则基础数据类型数字类型&#xff08;Numbers&#xff09;字符串类型&#xff08;String&#xff09;布尔类型&#xff08;Boolean&#xff09; 复合数据类型List&#xff08;列表&#xff09;Tuple&…

代码随想录DAY62

这个移动0的问题还是比较重要的 因为涉及到一种思想&#xff1a;快慢指针&#xff01; class Solution { public: void moveZeroes(vector<int>& nums) { int slow0,fast0; for(;fast<nums.size();fast){ if(nums[fast]!0){ swap(nums[slow],nums[fast]); slow;…

Kafka 什么速度那么快

批量发送消息 Kafka 采用了批量发送消息的方式&#xff0c;通过将多条消息按照分区进行分组&#xff0c;然后每次发送一个消息集合&#xff0c;看似很平常的一个手段&#xff0c;其实它大大提升了 Kafka 的吞吐量。 消息压缩 消息压缩的目的是为了进一步减少网络传输带宽。而…

故障012:定时备份作业-6007悬案

故障012&#xff1a;定时备份作业-6007悬案 1. 问题描述2. 解决过程2.1 大胆推想2.2 找规律2.3 尝试换掉AP2.4 检查资源限制2.5 资源放宽SYSDBA 3. 精神感悟 DM技术交流QQ群&#xff1a;940124259 1. 问题描述 诡异的现象总是伴随着隐藏的功能被打开&#xff0c;可能耽误你很…

比ChatGPT更强的星火大模型V2版本发布!

初体验 测试PPT生成 结果&#xff1a; 达到了我的预期&#xff0c;只需要微调就可以直接交付&#xff0c;这点比ChatGPT要强很多. 测试文档问答 结果&#xff1a; 这点很新颖&#xff0c;现在类似这种文档问答的AI平台收费都贵的离谱&#xff0c;星火不但免费支持而且效果也…

opencv图片换背景色

#include <iostream> #include<opencv2/opencv.hpp> //引入头文件using namespace cv; //命名空间 using namespace std;//opencv这个机器视觉库&#xff0c;它提供了很多功能&#xff0c;都是以函数的形式提供给我们 //我们只需要会调用函数即可in…

uniapp评论列表插件获取

从评论列表&#xff0c;回复&#xff0c;点赞&#xff0c;删除&#xff0c;留言板 - DCloud 插件市场里导入&#xff0c;并使用。 代码样式优化及接入如下&#xff1a; <template><view class"hb-comment"><!-- 阅读数-start --><view v-if&q…

5.利用matlab完成 符号矩阵的转置和 符号方阵的幂运算(matlab程序)

1.简述 Matlab符号运算中的矩阵转置 转置向量或矩阵 B A. B transpose(A) 说明 B A. 返回 A 的非共轭转置&#xff0c;即每个元素的行和列索引都会互换。如果 A 包含复数元素&#xff0c;则 A. 不会影响虚部符号。例如&#xff0c;如果 A(3,2) 是 12i 且 B A.&#xff0…

java中excel文件下载

1、System.getProperty(user.dir) 获取的是启动项目的容器位置 2、 Files.copy(sourceFile.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING); StandardCopyOption.REPLACE_EXISTING 来忽略文件已经存在的异常&#xff0c;如果存在就去覆盖掉它Sta…

00-认识C++

2、认识C 2.1、例子 一个简单的C例子 #include <iostream>int main() {using namespace std; //使用名称空间cout << "Com up and C me some time.";cout << endl; //换行符&#xff0c;还可以cout<<"\n";cout <…

驱动DAY5

1.实现设备文件和设备的绑定&#xff0c;编写LED驱动 2.复习竞态的解决方法和阻塞IO实现 第一个任务 头文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;u…

【MySQL系列】表内容的基本操作(增删查改)

「前言」文章内容大致是对MySQL表内容的基本操作&#xff0c;即增删查改。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL表内容的增删查改1.1 Create1.1.1 单行数据全列插入1.1.2 多行数据指定列插入1.1.3 插入否则更新1.1.4 数据替换 1.2 Ret…