【C语言初阶-结构体】关于结构体的声明定义、结构体传参详解

目录

1. 结构体的声明

1.1 结构的基础知识

1.2 结构的声明

1.3 结构成员的类型 

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

2. 结构体成员的访问

2.1(.)操作符

2.2(->)操作符

 3.结构体传参


1. 结构体的声明

1.1 结构的基础知识

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

对比数组,数组是一类同类型的值的结合

1.2 结构的声明

struct tag

{

member-list;//结构体成员(属性)列表

}variable-list;//创建的结构体类型变量列表

例如描述一个学生:

struct Stu

{

char name[20];//名字

int age;//年龄

char sex[5];//性别

char id[20];//学号

};//分号不能丢

1.3 结构成员的类型 

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

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

我们先创建一个结构体:

struct Stu

{

char name[20];//名字

int age;//年龄

char sex[5];//性别

char id[20];//学号

};//分号不能丢

因为我们创建的的是一个类型,结构体类型,他和整型,浮点型这些类型的含义是一样的,那比如我们就利用上面的学生结构体类型来创建一个个变量:

struct Stu  s1;//这个是s1就是一个结构体变量,他的类型是struct Stu

这是单独创建的办法,当然也可以在创建结构体类型的时候就直接创建变量:

struct Stu

{

char name[20];//名字

int age;//年龄

char sex[5];//性别

char id[20];//学号

}s2;//分号不能丢

//这里的上s2就是创建的结构体类型的变量,类型是struct Stu

有时候如果我们觉得,在创建变量的时候,要写出完整的结构体类型比如上面的s1变量的创建觉得有些麻烦,那我们就可以对结构体类型进行类型重定义:

typedef struct Stu

{

char name[20];//名字

int age;//年龄

char sex[5];//性别

char id[20];//学号

}Stu;//分号不能丢 

//这里的Stu就是我们重定义的类型

Stu = struct Stu

我们这次创建S1变量的时候就可以这样写:

Stu s1 ;

那我们对于上述结构体初始化:结构体初始化使用{}

1.struct Stu s1 = {0};//这种就是直接简单粗暴把所有的值都初始化为0

2.struct  Stu s2 = {"zhangsan",10,男,1234};//这里我们就初始化好了一个结构体变量

 对于我们结构体嵌套结构体的定义和初始化:

struct Point

{

int x;

int y;

};

struct Node

{ int data;

struct Point p;

struct Node* next;

}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化

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

2. 结构体成员的访问

2.1(.)操作符

结构体成员的访问使用‘.’操作符

点操作符接受两个操作数。

 首先我们创建一个结构体变量:

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

现在我想对结构体的两个成员单独赋值应该怎么做呢?

理由点操作符: 

//先创建一个结构体类型变量
struct Stu s1 ;
//对年龄进行赋值
s1.age = 20;
//对名字进行赋值
s1.name = [20];

2.2(->)操作符

结构体指针访问指向变量的成员 有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。 那该如何访问成员。(因为有时结构体作为函数参数进行传参就会传递结构体的地址,这个时候就会用到结构体类型的指针,下面讲) 如下:

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.mzph.cn/news/671089.shtml

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

相关文章

uniapp vue3怎么调用uni-popup组件的this.$refs.message.open() ?

vue2代码 <!-- 提示信息弹窗 --><uni-popup ref"message" type"message"><uni-popup-message :type"msgType" :message"messageText" :duration"2000"></uni-popup-message></uni-popup>typ…

算法笔记刷题日记——3.简单入门模拟 3.2 查找元素

刷题日记 3.2 查找元素 B1041 B1004 B1028 B1032 A1011 A1006 A1036 错题记录 B1028 人口普查 某城镇进行人口普查&#xff0c;得到了全体居民的生日。现请你写个程序&#xff0c;找出镇上最年长和最年轻的人。 这里确保每个输入的日期都是合法的&#xff0c;但不一定是合理的…

你为什么不喜欢关电脑?我只是想第二天能够快速进入工作状态

程序员不喜欢关电脑的主要原因就是&#xff1a;想第二天能够快速进入工作状态。大部分不喜欢关电脑的程序员都是很敬业的程序员。 程序员的电脑上安装了很多软件&#xff0c;包括IDE、数据库客户端、Redis客户端、思维导图、画图工具、数据库设计工具等。通常在工作的时候也会…

开关电源学习之Boost电路

如果我们需要给一个输入电压为5V的芯片供电&#xff0c;而我们只有一个3.3V的电源&#xff0c;那怎么办&#xff1f; 我们能不能把3.3V的电压升到5V&#xff1f; 一、电感的简介 而在升压的电路设计方案中&#xff0c;使用到一个重要的元器件&#xff1a;电感。 电感的特性…

【PyQt】05-多线程

文章目录 前言一、什么是单线程、多线程二、代码现象示例多线程代码运行结果 总结 前言 文章开始还是解释一下&#xff0c;这是跟着王铭东老师学习的。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、什么是单线程、多线程 单线程 在Python中&am…

TCP和UDP相关问题(重点)(1)

1.TCP与UDP的区别&#xff1f; TCP和UDP都是传输层的协议&#xff0c;对于TCP来说在传输数据前是必须要建立连接的&#xff0c;而UDP在传输数据前不需要建立连接&#xff1b;TCP是可靠传输服务&#xff0c;有三次握手、数据的确认、重传等机制&#xff0c;而UDP是不可靠的&…

PDF文件格式(一):交叉引用流

在PDF-1.5版本之前&#xff0c;对象的交叉引用信息是存储在交叉引用表(cross-reference table)中的。在PDF-1.5版本之后&#xff0c;引进了交叉引用流(cross-reference stream)对象&#xff0c;可以用它来存储对象的交叉引用信息&#xff0c;就像交叉引用表的功能一样。 采用交…

C遗漏知识(个人向)

之前C语言遗漏的一些。 数据在内存中的存储 原码、反码、补码 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 正整数的原、反、补码都相同。 负整数的三种表⽰⽅法各不相同。 原码&#xff1a;直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码&…

力扣383-赎金信

赎金信 题目链接 解题思路 统计magazine中字符出现的字符&#xff0c;用哈希表保存遍历ransomNote&#xff0c;记录其中出现的字符&#xff0c;出现一次&#xff0c;哈希表删除对应的字符遍历哈希表&#xff0c;如果有的字符出现的次数为负数&#xff0c;则不能拼凑出目标字符…

Javascript入门学(基础)

软件篇 JS基础语法第一天 1.javascript介绍 1.1 js是什么 是什么 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果&#xff0c;而html和css是标记性语言&#xff0c;并非编程语言有什么用 js的组成 htmlcssjs实现按钮点击功能 …

Vision Transfomer系列第一节---从0到1的源码实现

本专栏主要是深度学习/自动驾驶相关的源码实现,获取全套代码请参考 这里写目录标题 准备逐步源码实现数据集读取VIt模型搭建hand类别和位置编码类别编码位置编码 blocksheadVIT整体 Runner(参考mmlab)可视化 总结 准备 本博客完成Vision Transfomer(VIT)模型的搭建和flowers数…

什么是大模型

目录 让你了解什么是大模型什么是大模型&#xff1f;大模型的应用场景常见的大模型技术实例分析&#xff1a;深度学习语言模型GPT-3 让你了解什么是大模型 大模型&#xff08;Big Model&#xff09;是指在机器学习和人工智能领域中处理大规模数据和复杂模型的一种方法或技术。…

股票K线简介

股票K线&#xff08;K-Line&#xff09;是用于表示股票价格走势的图形&#xff0c;主要由四个关键价格点组成&#xff1a;开盘价、收盘价、最高价和最低价。K线图广泛应用于股票市场技术分析中&#xff0c;它提供了丰富的信息&#xff0c;帮助分析师和投资者理解市场的行情走势…

一周学会Django5 Python Web开发-Django5介绍及安装

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计10条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

leetcode 74.搜索二维矩阵

本题其实就是一个变形的二分查找而已。这里不采用两次二分或者一次二分的方法了&#xff0c;leetcode上是很详细的&#xff0c;这里就讲讲普通的思路是怎样的。 思路&#xff1a;首先就是把二维数组化为一维数组&#xff0c;这个时候一维数组需要开的大一些&#xff0c;不然的…

算法练习-四数之和(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;数组 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨在…

“过年买年货,花光了我的年终奖”

【潮汐商业评论/原创】 前脚刚进家门&#xff0c;后脚快递电话一个接着一个。 临近春节&#xff0c;Julia是提前批回家的年轻人&#xff0c;与Julia一同到家的还有她的年货。上至大小家电&#xff0c;下到坚果零食&#xff0c;短短几天快递就堆满了客厅。 吃的喝的还能理解&…

Linux 【yum 和 rpm 的区别】

结论 rpm和yum都是在Red Hat系列的Linux发行版&#xff08;如Fedora、CentOS、RHEL等&#xff09;中用于管理软件包的工具&#xff0c;但它们的使用场景和功能有所不同。 rpm&#xff08;Red Hat Package Manager&#xff09;是一个较低级别的工具&#xff0c;它直接处理.rpm文…

MySQL的优化

优化MySQL的几点&#xff1a; 从设计上优化 从查询上优化 从索引上优化 从存储上优化 1&#xff0c;SQL的执行频率 MySQL客户端连接成功后&#xff0c;通过show [session/global] status命令可以查看服务器状态信息。通过查看状态信息可以查看对当前数据库的主要操作类型…

数论:修改数列

5462. 修改数列 - AcWing题库 给定一个长度为 n 的正整数数列 a1,a2,…,an。 你可以对其中任意个&#xff08;可以是 0 个&#xff09;元素进行修改。 但是&#xff0c;每个元素最多只能修改一次&#xff0c;每次修改&#xff1a;要么令其加 11&#xff0c;要么令其减 11。 请问…