【逐步剖C】-第六章-结构体初阶

news/2024/11/24 1:57:11/

一、结构体的声明

1. 结构体的基本概念

结构体是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。结构体使得C语言有能力描述复杂类型。

如学生,有姓名、学号、性别等;如书,有作者,出版日期,价格等

2. 结构体的声明

(1)声明格式为:

struct tag
{member-list;
}variable-list;

其中member-list为结构体成员变量列表;variable-list为需要创建的结构体变量的列表
例如描述一个学生的结构体声明就可以写成:

 struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
};//分号不能丢

3. 结构体的成员类型

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

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

(1)定义

  • 沿用上面描述学生的声明,声明一个结构体变量可以有两种方式:
    声明类型的同时定义变量,即将变量名直接写在变量列表中;或者另起一行像定义其他类型变量一样定义结构体变量
    如下面这段代码:
 struct Stu
{char name[20];int age;char sex[5];char id[20];
}Stu1,Stu2;		//声明类型的同时定义变量Stu1和Stu2
struct Stu Stu3; //另起一行定义结构体变量Stu3

注意这里另起一行定义结构体变量的写法与下面即将提到的另一种方式区别

  • 还有一种定义方式,不过此时结构体声明部分与上面的略有不同,因为用到了 typedef类型重命名关键字,代码如下:
typedef struct Stu
{char name[20];int age;char sex[5];char id[20];
}Stu;

注意这里最后的Stu不是上面说所的变量列表中的内容,即不是声明类型的同时定义的变量,而是这个结构体类型的一个重命名,此时定义一个结构体变量的正确写法就应为:Stu Stu4;当然写成struct Stu Stu4;也没错。但需要注意上面没有用typedef关键字进行类型重命名的声明只能写成struct Stu 变量名;而不能写成Stu 变量名;
(2)初始化
即定义变量的同时赋予初值
这里继续沿用上面学生的声明:

 struct Stu
{char name[20];int age;char sex[5];char id[20];
}Stu1 = {"小明",16,"男","124410"}	//声明类型的同时定义变量Stu1
struct Stu Stu2 = {"小红",16,"女","124450"}; 
//另起一行定义结构体变量Stu2
  • 结构体的嵌套初始化:
struct Node
{int data;struct Point p;struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化

5. 补充说明

结构体的声明一般是放在主函数之外的,故声明类型的同时定义的变量一般为全局变量。虽然语法也允许结构体的声明放在主函数中,不过一般不这么做。

二、结构体成员的访问

1. 结构体变量访问成员

结构变量的成员是通过点操作符 ‘ . ’ 访问的。点操作符接受两个操作数,形式为结构体变量名.成员变量名。如下面这段代码:

#include <stdio.h>
struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
}Stu1 = { "小明",16,"男","124410" };//分号不能丢int main()
{printf("%s\n", Stu1.name);printf("%d\n", Stu1.age);printf("%s\n", Stu1.sex);printf("%s\n", Stu1.id);return 0;
}

运行结果:
在这里插入图片描述

2. 结构体指针访问成员

有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针
那么此时我们通过另一个操作符 ‘->’ 进行访问。如下代码:

#include <stdio.h>
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;
}

运行结果:
在这里插入图片描述

代码中的print函数的参数是一个结构体指针,故在进行参数传递时传的是结构体的地址(下面一部分还会说明),那么在print函数内部进行的成员访问实际上是通过结构体指针进行的。所以用到操作符 ‘->’ 。
由运行结果可以看出,使用操作符 ‘->’ 就等价于先解引用结构体指针得到结构体变量,再通过操作符 ‘ . ’ 进行成员访问。

三、结构体的传参

结构体的传参和变量的传参一样,分为值传递和地址传递。结构体在进行传参时一般用的都是地址传递,即传递结构体的地址。
原因函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

本章完。

看完觉得有觉得帮助的话不妨点赞收藏鼓励一下,有疑问或有误地方的地方还恳请过路的朋友们留个评论,多多指点,谢谢朋友们!🌹🌹🌹


http://www.ppmy.cn/news/23629.html

相关文章

冷知识|鹤顶红还能用来修长城?

大家好&#xff0c;我是建模助手。 在上篇浅浅地蹭了波热点之后&#xff0c;我灵机一动&#xff0c;倒不如也搞一搞建筑方面的冷知识&#xff1f;冷热搭配&#xff0c;事半功倍... 问问大家&#xff0c;如果谈起古建筑&#xff0c;关键词都有什么&#xff1f;是庄严、震撼、壮…

计算机入门基础知识大全

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽…

MySQL8.0之前实现row_number以及计算玩家连续登录天数

使用MySQL 5.7版本统计 玩家连续登录天数 原始数据 玩家同一天多次登录只保留一条 select DISTINCT(FROM_UNIXTIME(login_time,%Y-%m-%d)) as login_date,rid from t_log_login order by rid; 借助两个变量统计每个玩家登录日期对应的次数 SELECT * FROM(SELECT DISTINCT …

【代码随想录二刷】Day9-字符串-C++

代码随想录二刷Day9 今日任务 28.找出字符串中第一个匹配项的下标 459.重复的子字符串 字符串总结 双指针总结 语言&#xff1a;C KMP 链接&#xff1a;https://programmercarl.com/0459.重复的子字符串.html#kmp 用处&#xff1a;当出现字符串不匹配时&#xff0c;可以利…

差分模拟信号转单端输出电路设计

需求分析&#xff1a; 1.差分输入0~16V -Vpp电压量&#xff1b; 2.输入频率0~1.2KHz&#xff1b; 3.单端对应输出0~3V的模拟量&#xff1b; 4.输出频率对应0~1.2KHz&#xff1b; 5.供电范围3~5V。 针对以上需求&#xff0c;设计如下图所示电路。 1.电路功能&#xff1a; …

nvidia设置wifi和接口

tx-nx设置wifi和接口前言基础知识点1.创建和删除一个wifi连接2. 启动连接和关闭连接代码和调试1. 代码展示2. 调试写到最后前言 针对嵌入式开发&#xff0c;有时候通过QT或PAD跨网络对设备设置WIFI&#xff0c;在此记录下&#xff0c;方便后续的查阅。 基础知识点 1.创建和删…

167. 两数之和 II - 输入有序数组

给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index2 < numbers…

webpack新手入门

前言&#xff1a; 如何配置webpack呢&#xff1f; webpack概念有哪些呢&#xff1f; 怎么快速理解并使用webpack呢&#xff1f; 文章目录一. 什么是webpack二. 安装webpack三. webpack的五个核心概念四. webpack配置五. loader加载器1. css处理2. 处理文件&#xff08;图片&…