【c语言】结构体的访问

在这里插入图片描述

🎈个人主页:豌豆射手^
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:C语言
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

【c语言】结构体的访问

  • 一 通过结构体变量直接访问成员
  • 二 通过结构体指针访问成员
    • 2.1 概念
    • 2.2 原理
  • 总结

在这里插入图片描述

引言:

一 通过结构体变量直接访问成员

使用点运算符访问结构体变量成员的格式非常简单明了。

假设我们有一个结构体类型 struct_type 和一个该类型的变量 struct_variable,结构体中定义了一个或多个成员变量。要访问结构体变量中的某个成员,可以使用以下格式:

struct_variable.member_name;

其中:

  • struct_variable 是结构体变量的名称。
  • member_name 是结构体中定义的成员变量的名称。

例如,如果我们有一个结构体类型 Person,它包含 nameage 两个成员变量,我们可以如下定义结构体变量并访问其成员:

#include <stdio.h>// 定义结构体类型 Person
struct Person {char name[50];int age;
};int main() {// 定义结构体变量 personstruct Person person;// 初始化结构体变量的成员strcpy(person.name, "John Doe"); // 使用 strcpy 函数复制字符串到 name 成员person.age = 30; // 直接赋值给 age 成员// 访问结构体变量的成员并打印printf("Name: %s\n", person.name); // 使用点运算符访问 name 成员printf("Age: %d\n", person.age); // 使用点运算符访问 age 成员return 0;
}

运行结果:

Name: John Doe
Age: 30

解释:

main 函数中,我们定义了一个 Person 类型的结构体变量 person,并初始化其 name 成员为 “John Doe”,age 成员为 30。然后,我们使用 printf 函数和点运算符 (.) 来访问并打印 personnameage 成员。因此,程序输出这两行文本,分别是结构体变量 personnameage 成员的值。

注意,当成员变量是一个数组或结构体时,你仍然可以使用点运算符来访问数组的元素或结构体的成员。如果成员变量是一个指针,你还可以使用点运算符通过该指针访问它指向的数据。

例如:

以下是一个代码例子,演示了当结构体成员是数组、另一个结构体以及指针时,如何使用点运算符(.)来访问这些成员:

#include <stdio.h>
#include <string.h>// 定义一个内部结构体
struct Address {char street[50];char city[50];
};// 定义一个包含数组、内部结构体和指针的外部结构体
struct Student {char name[50];int grades[3]; // 数组struct Address address; // 内部结构体char *hobby; // 指针
};int main() {// 初始化一个Student结构体变量struct Student student;// 初始化name成员strcpy(student.name, "Alice");// 初始化grades数组student.grades[0] = 90;student.grades[1] = 85;student.grades[2] = 92;// 初始化address结构体成员strcpy(student.address.street, "123 Main St");strcpy(student.address.city, "New York");// 初始化hobby指针成员student.hobby = "Reading";// 访问并打印成员printf("Name: %s\n", student.name);printf("Grades: %d, %d, %d\n", student.grades[0], student.grades[1], student.grades[2]);printf("Address: %s, %s\n", student.address.street, student.address.city);printf("Hobby: %s\n", student.hobby);return 0;
}

代码结果:

Name: Alice
Grades: 90, 85, 92
Address: 123 Main St, New York
Hobby: Reading

代码分析:

  1. 我们定义了两个结构体类型,AddressStudentAddress 包含 streetcity 两个成员,用于存储地址信息。Student 包含 name(名字),grades(一个整数数组,存储三门课程的成绩),address(一个 Address 类型的结构体成员,存储地址信息),以及 hobby(一个字符指针,指向存储爱好的字符串)。

  2. main 函数中,我们创建了一个 Student 类型的变量 student 并初始化了它的各个成员。对于数组 grades,我们使用点运算符直接访问其元素。对于 Address 类型的成员 address,我们也使用点运算符访问其 streetcity 成员。对于 hobby 指针成员,我们同样使用点运算符来访问它指向的字符串。

  3. 最后,我们使用 printf 函数和点运算符来打印 student 的各个成员的值。这包括 namegrades 数组中的元素、address 结构体的 streetcity 成员,以及 hobby 指针指向的字符串。

注意,在这个例子中,hobby 是一个指向字符串的指针,而不是字符串本身。因此,当我们使用 student.hobby 时,我们实际上是在访问这个指针,并通过它间接访问存储的字符串。如果 hobby 指向的字符串是动态分配的,那么在不再需要它时,需要确保释放相应的内存以避免内存泄漏。

需要特别注意的是,点运算符只能用于直接访问结构体变量(而不是指向结构体的指针)的成员。如果你有一个指向结构体的指针,你应该使用箭头运算符 (->) 来访问结构体的成员。

二 通过结构体指针访问成员

2.1 概念

结构体指针是指向结构体变量的指针,可以通过该指针来访问结构体的成员。

通过结构体指针访问成员的方式主要涉及到两个操作符:->*

  1. 使用 “->” 操作符:当你有一个指向结构体的指针时,可以使用 “->” 操作符来直接访问结构体的成员。

例如,假设你有以下的结构体定义和指针:

typedef struct {int id;char name[50];
} Person;Person p1;
Person *ptr = &p1;

你可以这样使用 “->” 操作符来访问结构体的成员:

ptr->id = 1;
strcpy(ptr->name, "John Doe");
  1. 使用 “*” 操作符与 “.” 操作符组合:你也可以先使用 “*” 操作符来解引用结构体指针,得到一个结构体变量,然后再使用 “.” 操作符来访问其成员。

例如:

(*ptr).id = 1;
strcpy((*ptr).name, "John Doe");

这两种方式是等价的,但通常,使用 “->” 操作符更为简洁和直观。

总结:通过结构体指针访问成员主要涉及到 “->” 操作符或 “*” 与 “.” 的组合。在实际编程中,根据具体情况和个人习惯选择合适的方式。

2.2 原理

通过结构体指针访问成员的原理主要涉及到指针运算和内存布局的概念。

首先,理解指针的基本概念很重要。在C语言中,指针是一个变量,它存储的是另一个变量的内存地址。当你有一个指向结构体类型的指针时,这个指针存储的是该结构体在内存中的起始地址。

结构体在内存中的布局是连续的。结构体中的每个成员都按照它们在结构体定义中的顺序占据一定的内存空间。这些内存空间是连续的,从结构体的起始地址开始,一直延伸到结构体的末尾。

->运算符就是用来通过结构体指针访问其成员的一种语法糖。当你使用pStudent->id这样的表达式时,编译器会执行以下步骤:

  1. 获取pStudent指针所存储的地址,即结构体的起始地址。
  2. 根据id成员在结构体中的偏移量(从结构体起始地址到id成员首地址的距离),计算出id成员在内存中的实际地址。
  3. 通过这个地址访问id成员的值。

偏移量是在编译时确定的,它取决于结构体中每个成员的类型和顺序。编译器知道如何根据结构体的定义来计算每个成员的偏移量。

因此,通过结构体指针访问成员的原理就是利用指针所存储的地址信息,结合结构体成员在内存中的布局和偏移量,来间接访问结构体的成员。这种方式允许程序在不知道结构体具体实例的情况下,通过指针来操作结构体的数据,提高了代码的灵活性和可重用性。

总结

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是豌豆射手^,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

SQL SERVER的安装

目录 1.百度SQL SERVER找到图下的所显示的&#xff0c;点击进去 2.找到图下红色框起来的&#xff0c;点击立即下载 3.下载好之后点开&#xff0c;选择下载介质 4.SQLSERVER下载成功之后选择打开文件夹 6.双击后缀名是.iso的镜像文件 7.双击setup.exe进行安装 8.安装成功…

如何进行支付功能的测试?

非现金支付时代&#xff0c;非现金支付已经成为了生活不可或缺的一部分&#xff0c;我们只需要一台手机便可走遍全国各地&#xff08;前提是支付宝&#xff0c;微信有钱<00>&#xff09;。 那么作为测试人员&#xff0c;支付测试也是非常重要的一环&#xff0c;那么下面…

【随笔】Git 高级篇 -- 模拟团队合作 git fetch git pull(二十九)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

网络工程师-----第一天

线缆与进制转换 进制转换: 1.十进制&#xff1a; 都是以0-9这九个数字组成&#xff0c;不能以0开头。 2.二进制&#xff1a; 由0和1两个数字组成。 3.八进制&#xff1a; 由0-7数字组成&#xff0c;为了区分与其他进制的数字区别&#xff0c;开头都是以0开始。 4.十六进制…

HBase的数据模型与架构

官方文档&#xff1a;Apache HBase – Apache HBase™ Homehttps://hbase.apache.org/ 一、HBase概述 1.概述 HBase的技术源自Google的BigTable论文&#xff0c;HBase建立在Hadoop之上&#xff0c;是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;用于…

修改element-ui中el-calendar(日历)的样式

效果图如下&#xff1a; <template><div class"dashboard-container"><el-card style"width: 350px; height: auto; border-radius: 8px"><div class"custom-style"><p class"new-data">{{ newDate }}&…

嵌入式学习——C语言基础——day2

1. gcc的编译过程 1.1 预处理 处理和 " # " 相关的代码 gcc -E filename.c -o filename.i 1. 头文件 2. 宏定义 3. 条件编译 1.2 编译 将c语言代码编译成汇编代码 gcc -S filename.c -o filename.s 1.3 汇编 将汇编代码编译成二进制代码 gcc -c filename.c -o f…

微信小程序-绘制图片并分享下载(painter)

1、引入painter插件 painter官网地址 1.1 可通过官网的方法引入painter插件&#xff0c; 官方插件下载地址 1.2 可下载本文附带的插件包直接引入 1.2.1 复制下载下来的文件中的painter文件夹&#xff0c;将其放在components目录下 1.2.2 页面中引入并使用 .json {"…

刷穿力扣006-剑指offer一数组——02寻找目标值-二维数组

刷穿力扣006-剑指offer<一>数组——02寻找目标值-二维数组 基本面试题都是我带大家刷的力扣热题100和剑指offer的75道题&#xff0c;建议刷两遍&#xff01;&#xff08;ps:想找工作实习的同学&#xff0c;文末有面试八股和简历模板&#xff09; 题目&#xff1a; 语言…

408数据结构,怎么练习算法大题?

其实考研的数据结构算法题是有得分技巧的 得分要点 会写结构定义&#xff08;没有就自己写上&#xff09;写清楚解题的算法思想描述清楚算法实现最后写出时间和空间复杂度 以上这四步是完成一道算法题的基本步骤&#xff0c;也是其中得分的主要地方就是后面两步。但是前面两…

四.吊打面试官系列-数据库优化-Mysql锁和事务原理

前言 本篇文章主要讲解两块内容&#xff1a;Mysql中的锁和ACID原理&#xff0c;这2个部分是面试的时候被问的蛮多的看完本篇文章之后相信你对Mysql事务会有更深层次的理解&#xff0c;如果文章对你有所帮助请记得好评 一.Mysql中的锁 1.锁的分类 在Mysql中锁也分为很多种&a…

Vue3 ts环境下的PropType

简介 在Typscript中&#xff0c;我们可以使用PropType进行类型的推断与验证。在日常的开发中我们常常会遇到下面这样的场景&#xff1a; 我们通过request请求从服务端获取了一条数据&#xff0c;数据是个Array的格式&#xff0c;Array中的每个元素又是一个对象&#xff0c;像下…