C语言结构体详解

系列文章目录

第一章 C语言基础知识

第二章 C语言控制语句

第三章 C语言函数详解

第四章 C语言数组详解

第五章 C语言操作符详解

第六章 C语言指针详解

文章目录

系列文章目录

1. 结构体的声明

1.1 结构的声明

1.2 使用结构体

1.3 结构体的高级用法

结构体指针

结构体数组

嵌套结构体

1.4 代码示例

2. 结构体成员的访问

2.1 使用点操作符(.)

2.2 使用箭头操作符(->)

3. 结构体传参

3.1 结构体按值传递

3.2 结构体按引用传递(使用指针)


1. 结构体的声明

结构体(Structure)是一种允许将多个不同类型的数据项组合成一个单一实体的复合数据类型。

1.1 结构的声明

结构体是通过关键字 struct 定义的。结构体的声明包括结构体的名称和它所包含的数据项(称为成员)。成员可以是任意类型,包括基本类型(如 intchar)、数组、指针,甚至包含其他结构体。

基本语法:

struct 结构体名称 {数据类型 成员1名称;数据类型 成员2名称;...
};

代码示例:

假设需要定义一个结构体来存储一个学生的信息,包括姓名、年龄和分数。

struct Student {char name[50];int age;float score;
};

在这个例子中,struct Student 是一个结构体,它有三个成员:

name 是一个字符数组,用于存储学生的名字。
age 是一个整型(int),用于存储学生的年龄。
score 是一个浮点型(float),用于存储学生的分数。

1.2 使用结构体

定义结构体之后可以创建该类型的变量,并使用点运算符(.)来访问其成员。

访问和设置成员值:代码示例:

#include <stdio.h>
#include <string.h> // 用于 strcpy 函数int main() {struct Student stu1; //创建结构体变量// 设置结构体成员的值strcpy(stu1.name, "John Doe"); // 使用 strcpy 来赋值字符串stu1.age = 20;stu1.score = 92.5;// 打印结构体成员的值printf("Name: %s\n", stu1.name);printf("Age: %d\n", stu1.age);printf("Score: %.2f\n", stu1.score);return 0;
}

1.3 结构体的高级用法

结构体指针

创建指向结构体的指针,并通过箭头运算符(->)访问结构体的成员。

struct Student *ptr = &stu1;
printf("Name: %s\n", ptr->name);

结构体数组

结构体可以组成数组,用于存储多个结构体变量。

struct Student class[30]; // 创建一个包含30个学生的数组

嵌套结构体

结构体可以嵌套使用,即一个结构体的成员可以是另一个结构体。

struct Date {int day;int month;int year;
};struct Profile {char name[50];struct Date birthday;
};

1.4 代码示例

// 定义一个名为 Point 的结构体类型,包含两个整型成员 x 和 y
struct Point
{int x;int y;
} p1; // 在声明结构体类型的同时定义了一个名为 p1 的变量// 定义一个结构体变量 p2,类型为 struct Point
struct Point p2;// 定义并初始化结构体变量 p3,假设 x 和 y 在此上下文中已定义
struct Point p3 = {x, y};// 定义一个名为 Stu 的结构体类型,包含一个字符数组 name 和一个整型 age
struct Stu
{char name[15];  // 名字int age;        // 年龄
};// 定义并初始化结构体变量 s
struct Stu s = {"zhangsan", 20};  // 用具体的值初始化 name 和 age// 定义一个名为 Node 的结构体类型,包含一个整型 data,一个 Point 类型的结构体成员 p,和一个指向 Node 类型的指针 next
struct Node
{int data;struct Point p;struct Node* next; 
} n1 = {10, {4, 5}, NULL};  // 初始化,包括嵌套的 Point 结构体成员和 NULL 指针// 定义并初始化另一个 Node 类型的结构体变量 n2
struct Node n2 = {20, {5, 6}, NULL};  // 类似地初始化

2. 结构体成员的访问

结构体成员的访问是通过结构体变量来实现的,使用点操作符(.)或箭头操作符(->)来访问结构体的成员。点操作符用于普通的结构体变量,而箭头操作符用于指向结构体的指针。下面详细解释这两种访问方式。

2.1 使用点操作符(.

当有一个结构体类型的变量时,可以使用点操作符来访问其任何成员。这是最直接的方式来访问结构体中的字段。

#include <stdio.h>struct Person {char name[100];int age;
};int main() {struct Person person;// 设置结构体成员的值strcpy(person.name, "Alice");person.age = 30;// 访问结构体成员的值printf("Name: %s\n", person.name);printf("Age: %d\n", person.age);return 0;
}

在这个例子中创建了一个 Person 结构体,它有两个成员:name 和 age。通过结构体变量 person 和点操作符,可以设置和获取这些成员的值。

2.2 使用箭头操作符(->

当有一个指向结构体的指针时,可以使用箭头操作符来访问指针指向的结构体的成员。这是处理结构体指针时的标准方法。

#include <stdio.h>struct Person {char name[100];int age;
};int main() {struct Person person;struct Person *ptr = &person;// 使用指针设置结构体成员的值strcpy(ptr->name, "Bob");ptr->age = 25;// 使用指针访问结构体成员的值printf("Name: %s\n", ptr->name);printf("Age: %d\n", ptr->age);return 0;
}

在这个例子中再次使用 Person 结构体,但这次通过一个指向 person 的指针 ptr 来访问和设置成员。注意使用了箭头操作符 (->) 而不是点操作符。

3. 结构体传参

结构体可以作为函数的参数进行传递。尤其是需要在函数间共享或操作复杂数据时。结构体传参可以通过两种主要方式实现:按值传递和按引用(指针)传递。

3.1 结构体按值传递

当结构体按值传递时,实际上传递的是结构体的一个副本。这意味着,在函数中对结构体成员的任何修改都不会影响原始结构体。

优点

  • 安全:函数中的更改不会影响原始数据。
  • 简单:直接操作结构体,不涉及指针。

缺点

  • 效率低:对于较大的结构体,复制整个结构可能导致显著的性能开销。
  • 内存使用:增加内存消耗,特别是结构体较大时。

示例代码:

#include <stdio.h>struct Point {int x;int y;
};// 函数定义:按值传递结构体,接收一个 Point 结构体的副本
void movePoint(struct Point p) {p.x += 10;  // 在副本上修改 x 坐标p.y += 10;  // 在副本上修改 y 坐标printf("Inside function: x = %d, y = %d\n", p.x, p.y); // 打印修改后的副本坐标
}int main() {struct Point point = {100, 100}; // 初始化一个 Point 结构体实例movePoint(point); // 调用函数,传入 point 的副本printf("Outside function: x = %d, y = %d\n", point.x, point.y); // 打印原始坐标,观察是否有变化return 0;
}

在这个例子中,movePoint 函数按值接收一个 Point 结构体。在函数内部修改结构体不会影响原始结构体的值。 

3.2 结构体按引用传递(使用指针)

当结构体通过指针传递时,传递的是结构体地址的副本,因此在函数中对结构体的修改将影响原始结构体。

优点

  • 高效:无论结构体大小如何,传递的都只是一个地址。
  • 功能强大:可以在函数内部修改原始结构体。

缺点

  • 安全性:需要确保传入的指针有效,避免野指针等问题。
  • 稍复杂:需要正确处理指针。

示例代码

#include <stdio.h>struct Point {int x;int y;
};// 函数定义:按引用传递结构体,接收一个指向 Point 结构体的指针
void movePoint(struct Point *p) {p->x += 10; // 通过指针修改原始结构体的 x 坐标p->y += 10; // 通过指针修改原始结构体的 y 坐标printf("Inside function: x = %d, y = %d\n", p->x, p->y); // 打印修改后的坐标
}int main() {struct Point point = {100, 100}; // 初始化一个 Point 结构体实例movePoint(&point); // 调用函数,传入 point 的地址printf("Outside function: x = %d, y = %d\n", point.x, point.y); // 打印坐标,检查修改是否影响到原始数据return 0;
}

在这个例子中,movePoint 函数接受一个指向 Point 结构体的指针。通过指针对结构体的修改会反映到原始结构体上。

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

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

相关文章

gin框架提高篇(四)

参数校验&#xff08;一&#xff09; uuid包&#xff1a;https://github.com/satori/go.uuid 因为作者更改了参数限制&#xff0c;导致会出问题 → 问题解决 package mainimport ("fmt""github.com/gin-gonic/gin""github.com/go-playground/validato…

盲人盲杖:科技革新,助力视障人士独立出行

在我们的社会中&#xff0c;盲人朋友们以其坚韧的精神风貌&#xff0c;生动诠释着生活的多样与可能。然而&#xff0c;当我们聚焦于他们的日常出行&#xff0c;那些普通人视为寻常的街道、路口&#xff0c;却成为他们必须面对的严峻挑战。如何切实提升盲人盲杖的功能&#xff0…

【Linux进阶之路】高级IO

一、 铺垫 I&#xff0c;即input为输入&#xff1b;O&#xff0c;即output为输出&#xff0c;IO&#xff0c;即input output为输入输出。IO一般是基于网卡&#xff0c;磁盘&#xff0c;光盘&#xff0c;U盘&#xff0c;磁盘&#xff0c;磁带等毫秒级别的外存&#xff0c;相较…

Python实现贪吃蛇

提供学习或者毕业设计使用,功能基本都有,不能和市场上正式游戏相提比论,请理性对待!通过购买专栏或者CSDN问答提问,采纳后,私信博主。提供源码! 说明:需要的话联系博主!谢谢。 代码: import pygame import random import tkinter as tk from tkinter import mess…

BetterZip 5 for Mac:轻松解压缩的得力助手

BetterZip 5 for Mac是一款专为苹果电脑用户设计的压缩与解压软件&#xff0c;以其强大的功能和便捷的操作赢得了广大用户的喜爱。 BetterZip 5 for Mac v5.3.4中文版下载 这款软件支持多种主流的压缩格式&#xff0c;如ZIP、RAR、7-Zip等&#xff0c;满足了用户多样化的需求。…

WordPress 主题选择与自定义配置

最近我在使用wordpress网站进行建站。 我是使用的hostease的主机产品进行wordpress建站&#xff0c;在选择wordpress主题时颇为头疼。后来咨询了hostease的客服人员&#xff0c;他们家的技术人员提供了诸多帮助。在WordPress网站建设时&#xff0c;主题选择对于建立各类网站至关…

【MIT6.824】lab2C-persistence, lab2D-log compaction 实现笔记

引言 lab2C的实验要求如下 Complete the functions persist() and readPersist() in raft.go by adding code to save and restore persistent state. You will need to encode (or “serialize”) the state as an array of bytes in order to pass it to the Persister. Us…

【C++风云录】开源金融与科技库探索:优化计算与高效分析

高效计算与智能分析&#xff1a;开源库在金融和科技领域的应用探究 前言 本文将探索几个关键的开源库&#xff0c;包括QuantLib、TA-Lib、Boost.Asio、Armadillo和FastFlow&#xff0c;这些库在金融领域和科技领域中发挥着重要作用。通过使用这些工具&#xff0c;开发人员能够…

记录——FPGA的学习路线

文章目录 一、前言二、编程语言2.1 书籍2.2 刷题网站2.3 仿真工具 三、基础知识3.1 专业基础课3.2 fpga相关专业知识 四、开发工具五、动手实验 一、前言 也不是心血来潮想学习fpga了&#xff0c;而是祥哥还有我一个国科大的同学都在往fpga这个方向走 并且看过我之前文章的同…

合并有序表 (顺序存储 和 链式存储 方式实现)

代码详细解析: 合并有序表文章浏览阅读1.4k次&#xff0c;点赞6次&#xff0c;收藏7次。●假设有两个有序表 LA和LB , 将他们合并成一个有序表LC●要求不破坏原有的表 LA和 LB构思:把这两个表, 合成一个有序表 , 不是简简单单吗?就算是把他们先遍历不按顺序插入到表 C里面 , …

万物皆可计算|下一个风口:近内存计算-2

虽然PIM可以有缓解内存墙的问题&#xff0c;但是PIM设计面临着一系列技术和工程上的挑战&#xff0c;这些挑战直接影响着PIM技术的实用化和广泛应用&#xff1a; 地址翻译与操作映射&#xff1a; 在传统计算机体系结构中&#xff0c;地址空间由操作系统管理和调度&#xff0c;通…

Hotcoin 热门资产上新速报:以太坊互操作性基础设施Omni Network(OMNI)

Hotcoin持续为全球600万用户发掘优质潜力资产&#xff0c;热门币种交易上热币。一文快速了解今日上新资产:Omni Network&#xff08;OMNI&#xff09; 推荐指数 8.4 交易对 OMNI/USDT 交易时间 4月17日 GMT8 20&#xff1a;30 资产赛道 Layer1 项目简介 Omni 是以太坊…

关于电脑蓝屏解决方法(ST-LINK/ J-Link)

问题背景&#xff1a; 电脑win11系统&#xff0c;使用到STM32CUBEIDE STM32MP157A在实际的烧录情况中&#xff0c;烧录器插到电脑上面&#xff0c;电脑立即蓝屏。(封面蓝屏图片不为本问题蓝屏图片) 其他类似情况也可参考。 问题分析&#xff1a; 可能是激发了电脑的保护&…

【星瑞格】SinoDB国产数据库安装初体验及学习指南

今天和大家一起来看看一款来自福建的国产数据库——SinoDB。本人很早就听说过这款数据库&#xff0c;而且星瑞格公司就在同一栋办公楼。虽然以前就已经对这颗国产数据库有一定的了解&#xff0c;并没有真正的去使用一把。随着数据库国产化改造工作的推进&#xff0c;身边的客户…

TCP机械臂测试

#include<myhead.h> #define SER_IP "192.168.125.242" #define SER_PORT 1234 #define CLI_IP "192.168.243.131" #define CLI_PORT 9999 int main(int argc, const char *argv[]) { //1、创建用于通信的套接字文件描述符 int cfd socket(…

vue+springboot实现聊天功能

前言 在我的项目中&#xff0c;突然有种想法&#xff0c;想实现聊天功能&#xff0c;历经一段时间终于做出来了&#xff1b;那么接下来会讲解如何实现&#xff0c;这篇文章只会实现最基础的逻辑&#xff0c;实时获取对方聊天记录&#xff0c;话不多说&#xff0c;我们就开始吧…

吹爆,一款实用的个人IT工具箱

作为一名开发人员&#xff0c;我们在日常工作和学习中常常需要使用一系列小工具&#xff0c;如JSON格式化、JSON转表格、当前时间戳、XML格式化、SQL格式化、密码生成以及UUID生成等。通常情况下&#xff0c;我们会在网上搜索各种在线工具来满足这些需求。 然而&#xff0c;这…

odoo17开发教程(21):数据文件详解

Odoo 以数据为导向&#xff0c;因此模块定义的一个重要部分就是其管理的各种记录的定义&#xff1a;用户界面&#xff08;菜单和视图&#xff09;、安全性&#xff08;访问权限和记录规则&#xff09;、报告和普通数据都是通过记录定义的。 结构 在 Odoo 中定义数据的主要方式…

【C++ 哈希应用】

文章目录 位图概念代码实现海量数据处理 布隆过滤器概念代码实现海量数据处理 哈希切割海量数据处理 位图 概念 一个值在给定的集合中有两种状态&#xff0c;在或不在&#xff0c;要表示这种状态&#xff0c;最少可以用一个比特位&#xff0c;比特位为1表示在&#xff0c;比特…

【简单介绍下单片机】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…