【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.rhkb.cn/news/306516.html

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

相关文章

宏景eHR customreport/tree SQL注入漏洞复现

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR customreport/tree 接口处存在SQL注入漏洞,未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令,从而窃取数据库…

【cocos creator】【TS】贝塞尔曲线,地图之间显示曲线,顺着曲线移动

参考&#xff1a; https://blog.csdn.net/Ctrls_/article/details/108731313 https://blog.csdn.net/qq_28299311/article/details/104009804 const { ccclass, property } cc._decorator;ccclass export default class mapPanel extends cc.Component {property(cc.Node)pla…

力扣HOT100 - 41. 缺失的第一个正数

解题思路&#xff1a; 原地哈希 就相当于&#xff0c;让每个数字n都回到下标为n-1的家里。 而那些没有回到家里的就成了孤魂野鬼流浪在外&#xff0c;他们要么是根本就没有自己的家&#xff08;数字小于等于0或者大于nums.size()&#xff09;&#xff0c;要么是自己的家被别…

试题 C: 质因数个数

萎了&#xff0c;整个人都萎了 快三天都没刷题了&#xff0c;想着明天就蓝桥杯了&#xff0c;就找了个真题做了下 可以看得出来这题很简单 但是没有测试点给我用&#xff0c;所以我的代码不保证正确性 代码如下&#xff1a; #include<cstdio> #include<cmath> …

014:vue3 van-list van-pull-refresh实现上拉加载,下拉刷新

文章目录 1. 实现上拉加载&#xff0c;下拉刷新效果2. van-list&#xff0c;van-pull-refresh组件详解2.1 van-list组件2.2 van-pull-refresh组件 3. 完整案例4. 坑点&#xff1a;加载页面会一直调用加载接口 1. 实现上拉加载&#xff0c;下拉刷新效果 通过下拉刷新加载下一页…

20240405,数据类型,运算符,程序流程结构

是我深夜爆炸&#xff0c;不能再去补救C了&#xff0c;真的来不及了&#xff0c;不能再三天打鱼两天晒网了&#xff0c;真的来不及了呜呜呜呜 我实在是不知道看什么课&#xff0c;那黑马吧……MOOC的北邮的C正在进行呜呜 #include <iostream> using namespace std; int…

力扣 | 54. 螺旋矩阵

注意按照顺时针方向进行访问元素&#xff0c;以及每次触发的条件只会满足一个&#xff01; public List<Integer> spiralOrder(int [][] matrix){List<Integer> result new ArrayList<>();int m matrix.length;int n matrix[0].length;int row0,col 0;//…

【汇编】计算机系统构成

计算机系统构成 计算机系统包括硬件和软件两部分 硬件 典型的计算机结构包括 中央处理器(CPU)、存储器和输入输出(I/O)子系统 三个主要组成部分&#xff0c;用系统总线把它们连接在一起 计算机硬件组成与各部分之间的联系 软件 计算机软件可以分为系统软件和用户软件两大类 …

react17中配置webpack:使用@代表src目录

在vue的项目中可以使用表示src目录&#xff0c;使用该符号表示绝对路径&#xff0c;那么在react中想要使用怎么办呢&#xff1f; 在react中使用表示src目录是需要在webpack中配置的&#xff0c;在核心模块node_modules-》react-scripts-》config-》webpack.config.js中搜索找到…

必应bing搜索广告推广国内能开户吗?

随着互联网广告市场的不断进化和细分化&#xff0c;必应Bing搜索广告已逐渐成为中国企业拓展国内市场、精准触达目标客户的重要渠道之一。2024年&#xff0c;必应Bing在国内市场的进一步布局&#xff0c;不仅彰显了其对本土企业的强大吸引力&#xff0c;更带来了全新的开户政策…

Java基础入门--第十一章--JDBC(Java Database Connection)Java数据库连接

JDBC 11.1 什么是JDBC11.1.1 JDBC概述11.1.2 JDBC驱动程序 11.2 JDBC的常用API11.3 JDBC编程11.3.1 JDBC 编程步骤11.3.2 实现第一个JDBC程序 我的MySQL的root密码: root 11.1 什么是JDBC 11.1.1 JDBC概述 JDBC的全称是Java数据库连接&#xff08;Java Database Connectivit…

React - 你知道props和state之间深层次的区别吗

难度级别:初级及以上 提问概率:60% 如果把React组件看做一个函数的话,props更像是外部传入的参数,而state更像是函数内部定义的变量。那么他们还有哪些更深层次的区别呢,我们来看一下。 首先说props,他是组件外部传入的参数,我们知道…

【React】React18+Typescript+craco配置最小化批量引入Svg并应用的组件

React18Typescriptcraco配置最小化批量引入Svg并应用的组件 前言创建React Typescript项目通过require.context实现批量引入Svg安装[types/webpack-env](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.zh-Hans.md)解决类型报错安装[craco](https://…

数据中心的网络架构设计,打造高效、安全的数字底座

数据中心的网络架构设计 一、数据中心网络架构设计原则 网络,作为数据中心的核心支柱,其结构精妙,由众多二层接入设备与少量三层设备共同编织而成。过去,数据中心网络规模有限,仅凭数十台设备的简单互连便能实现信息的畅通无阻。然而,随着技术与应用需求的飞速增长,数据…

16. 网络编程(1)

Hi,大家好!从本节开始我们学习网络编程相关的知识。基于TCP服务器和客户端实现流程框架。 本节目录: 网络编程在软件开发中具有相当重要的作用,涉及到各方各面: 网络通信: Linux系统作为一个多用户、多任务的操作系统,网络通信是其重要的功能之一。通过网络编程,可以实现…

Rust面试宝典第2题:逆序输出整数

题目 写一个方法&#xff0c;将一个整数逆序打印输出到控制台。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如&#xff1a;123的逆序输出为321&#xff0c;8600的逆序输出为68&#xff0c;-609的逆序输出为-906。 解析 这道题本身并没有什么…

域控软件安全隔离关键技术剖析:MCU域 VS SOC域

安全隔离的需求 功能安全开发中&#xff0c;软件阶段由软件V模型左边的软件安全需求SSR开始。SSR是从技术安全需求TSR中提取出软件的功能安全需求&#xff0c;大多数情况下具有不同的ASIL等级。 图1 功能安全软件开发V模型 随后&#xff0c;软件安全需求会被分配到软件架构中的…

LeetCode110:平衡二叉树

题目描述 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 解题思想 使用递归依次计算左子树的高度和右子树的高度 代码 class Solution { public:int height(TreeNode* node) {if (node nullptr) return 0;int leftT height(node->left);if (leftT -1) return -1;…

Kivy 学习2

from kivy.app import App from kivy.uix.button import Button from kivy.uix.floatlayout import FloatLayout from kivy.graphics import Rectangle, Colorclass FloatLayoutApp(App):def build(self):def update_rect(layout, *args):设置背景尺寸&#xff0c;可忽略layout…

PlayerSettings.WebGL.emscriptenArgs设置无效的问题

1&#xff09;PlayerSettings.WebGL.emscriptenArgs设置无效的问题 2&#xff09;多个小资源包合并为大资源包的疑问 3&#xff09;AssetBundle在移动设备上丢失 4&#xff09;Unity云渲染插件RenderStreaming&#xff0c;如何实现多用户分别有独立的操作 这是第381篇UWA技术知…