(十二)C语言的结构体

一.结构体

数组:允许定义可存储相同类型数据项的变量,
结构:另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
特点:结构体中的数据成员可以是基本数据类型(如 int、float、char 等),也可以是其他结构体类型、指针类型等。

结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:
Title
Author
Subject
Book ID

二.结构体的声明与变量定义

结构体定义由关键字 struct 和结构体名组成,结构体名可以根据需要自行定义。
struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:

struct tag { member-listmember-list member-list  ...
} variable-list ;
tag :结构体标签。
member-list :标准的变量定义,比如 int i; 或者 float f;,或者其他有效的变量定义。
variable-list :结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量

三.结构体的大小计算

C 语言中,我们可以使用 sizeof 运算符来计算结构体的大小,sizeof 返回的是给定类型或变量的字节大小。对于结构体,sizeof 将返回结构体的总字节数,包括所有成员变量的大小以及可能的填充字节。
以下实例演示了如何计算结构体的大小:

#include <stdio.h>struct Person {char name[20];int age;float height;
};//结构体声明int main() {struct Person person;//结构体的变量定义printf("结构体 Person 大小为: %zu 字节\n", sizeof(person));return 0;
}
结构体 Person 大小为: 28 字节

四.结构体的使用

结构体变量的初始化:

#include <stdio.h>struct Books
{char  title[50];char  author[50];char  subject[100];int   book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};//变量初始化int main()
{printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);//变量使用
}
title : C 语言
author: RUNOOB
subject: 编程语言
book_id: 123456

为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。您可以使用 struct 关键字来定义结构类型的变量。下面的实例演示了结构的用法:

#include <stdio.h>struct Books
{char  title[50];char  author[50];char  subject[100];//结构体存放数组成员int   book_id;
};int main( )
{struct Books Book1 = {"C Programming","Nuha Ali","C Programming Tutorial",6495407};        //结构体的变量1初始化struct Books Book2 = {"Telecom Billing","Zara Ali","Telecom Billing Tutorial",6495700};        //结构体的变量2初始化/* 输出 Book1 信息 */printf( "Book 1 title : %s\n", Book1.title);printf( "Book 1 author : %s\n", Book1.author);printf( "Book 1 subject : %s\n", Book1.subject);printf( "Book 1 book_id : %d\n", Book1.book_id);/* 输出 Book2 信息 */printf( "Book 2 title : %s\n", Book2.title);printf( "Book 2 author : %s\n", Book2.author);printf( "Book 2 subject : %s\n", Book2.subject);printf( "Book 2 book_id : %d\n", Book2.book_id);return 0;
}
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

五.结构体数组

结构体数组:数组中每一元素都是结构体。

#include <stdio.h>
struct test{int n1 ;float n2;char n3;
};
int main()
{struct test Arr[3]={ {1,2,3},{4,5,6},{7,8,9} };//相当于定义了三个结构体变量并且初始化for(int i = 0; i<3 ; i++){printf("Arr[%d].n1=%d\n",i,Arr[i].n1);printf("Arr[%d].n2=%.1f\n",i,Arr[i].n2);printf("Arr[%d].n3=%d\n",i,Arr[i].n3);}return 0;
}
//struct test Arr[0]={1,2,3};
Arr[0].n1=1
Arr[0].n2=2.0
Arr[0].n3=3
//struct test Arr[1]={4,5,6};
Arr[1].n1=4
Arr[1].n2=5.0
Arr[1].n3=6
//struct test Arr[2]={7,8,9};
Arr[2].n1=7
Arr[2].n2=8.0
Arr[2].n3=9

六.结构体指针

结构体指针:一个指针变量指向结构体

struct 结构体名 *变量名;

结构体变量名与数组名不一样,数组名在表达式中会被转换成数组指针,而结构体变量名不会,无论在任何表达式中标表示的都是整个结构体本身,要取结构体变量的地址,则必须使用取地址符&。
(1)结构体指针获取结构体成员

通过结构体指针获取结构体成员的方式
1(*ptr).structMember
2、ptr->structMember
.运算符高于*,所以(*ptr)括号不能少
#include <stdio.h>
struct test{int num;char ch;double doub;
}t1;
int main()
{struct test t1 = {5,'A',5.6};struct test *ptr = &t1;//解引用和点运算符printf("type0:t1.num=%d\n",t1.num);//普通方式获取结构体成员printf("type1:(*ptr).num=%d\n",(*ptr).num); //指针方式printf("type0:t1.num=%c\n",t1.ch);//普通方式获取结构体成员printf("type2:  ptr->ch=%c\n",ptr->ch);//指针方式return 0;
}
type0:t1.num=5
type1:(*ptr).num=5
type0:t1.num=A
type2:  ptr->ch=A

(2)结构体指针作为函数参数
结构体变量名代表整个结构体变量本身,当把结构体变量本身作为参数传递时,结构体内部的结构体成员较多时会造成时间和空间开销大,影响程序的运行效率
使用结构体指针作为参数传递时,因为传递的是地址,会比原本含有较多结构体的结构体变量更加块,但是也会造成结构体变量数据被修改的可能。

#include <stdio.h>
#include <time.h>
struct test{int num;char ch;double doub;
}t1;void printA(struct test str)
{str.num += 5;printf("printA函数的num=%d\n",str.num);
}void printB(struct test* te)
{te->num += 15;printf("printB函数的num=%d\n",te->num);
}int main()
{clock_t start, finish,start1,finish1;struct test t1 = {5,'A',5.6};struct test *ptr = &t1;start = clock();printA(t1);finish = clock();double Total_time = (double)(finish - start);printf("printA函数之后,main函数的num=%d\n",t1.num);printf("printA运行时间=%f\n",Total_time);start1 = clock();printB(ptr);finish1 = clock();double Total_time1 = (double)(finish1 - start1);printf("printB函数之后,main函数的num=%d\n",t1.num);printf("printB运行时间=%f\n",Total_time1);return 0;
}

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

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

相关文章

Android 系统版本与SDK API对应关系-2024.5

官网地址&#xff1a;https://developer.android.google.cn/tools/releases/platforms?hlth

Vue 监控变化watch

1、watch 监控某个定义的属性的值,如果想要深层次的监听则需要定义deep:true 2、监控多层次单个元素使用"b.aa" 3、监控多层次所有的值定义deep:true ******data:{a:true,b:{aa:1,bb:2 }}*****catch:{a:{handler(newavlue,oldvalue){}},//监控b里面的aab.aa:{h…

经典分类网络LeNet5和VGG16项目:实现CIFAR10分类

CIFAR10分类 v1&#xff1a;LeNet5&#xff1a;2cnn3fc 可视化结果 精确率 损失 最佳 v2&#xff1a;LeNet5&#xff1a;3cnn2fc 可视化结果 精确率 损失 最佳 v3&#xff1a;LeNet5&#xff1a;2cnnbnres3fc 可视化结果 精确率 损失 最佳 v4&#xff1a;VG…

Sarcasm detection论文解析 |基于语义知识和辅助信息增强讽刺检测方法

论文地址 论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0306457322000139?via%3Dihub 论文首页 笔记框架 基于语义知识和辅助信息增强讽刺检测方法 &#x1f4c5;出版年份:2022 &#x1f4d6;出版期刊:Information Processing & Managem…

webpack进阶 -- 自定义Plugin,Loader封装打包优化

介绍 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。在 Webpack 处理应用程序时&#xff0c;它会在内部构建一个依赖图(dependency graph)&#xff0c;这个依赖图对应映射到项目所需的每个模块&#xff0c;并生成一个或多个 bundle。在这个过程中…

Docker-compsoe部署prysm-beacon-chain + geth服务(geth版本v1.14.0)

1、创建目录结构 ~ # mkdir -p /data/docker-compose/eth ~ # cd /data/docker-compose/eth /data/docker-compose/eth# mkdir beacondata eth ethdata prysm2、编写prysm-beacon-chain Dockerfile和启动脚本文件 /data/docker-compose/eth# vim Dockerfile /data/docker-…

Git的系统级设置

一、如何查看当前系统登录的GIt用户信息 1.看全局Git配置文件 cat ~/.gitconfig 2.查看系统级Git配置文件 cat /etc/gitconfig 3.使用Git命令查看配置的用户名和电子邮件地址 git config --global user.name git config --global user.email 4.如果你想查看所有Git配置&…

(delphi11最新学习资料) Object Pascal 学习笔记---第11章第2节 ( 多个接口与方法别名)

11.2.3 多个接口与方法别名 ​ 接口的另一个非常重要的特点是一个类可以实现多个接口。下面的 TAthlete 类就演示了这一点&#xff0c;该类同时实现了 IWalker 和 IJumper 接口&#xff1a; TAthlete class(TInterfacedObject, IWalker, IJumper) privateFJumpImpl: TJumpe…

旅行卡使用秘籍:告别出游烦恼

在现代社会&#xff0c;随着人们生活水平的不断提高&#xff0c;旅游已经成为越来越多人的休闲方式。而为了让旅行更加方便、实惠&#xff0c;各种旅游卡应运而生。然而&#xff0c;很多人在使用旅游卡时&#xff0c;对于其使用规则并不是非常清楚。接下来&#xff0c;我们就来…

如何把公章盖在电子档文件上?

将公章盖在电子档文件上&#xff0c;尤其是确保其法律效力和安全性&#xff0c;通常涉及以下步骤&#xff1a; 准备工作 获取合法的电子公章&#xff1a;确保你拥有公司或机构正式授权的电子公章图像&#xff0c;且该图像经过了必要的加密或数字签名处理&#xff0c;以确保其…

使用海外云手机为亚马逊店铺引流

在全球经济一体化的背景下&#xff0c;出海企业与B2B外贸企业愈发重视海外市场的深耕&#xff0c;以扩大市场份额。本文旨在探讨海外云手机在助力亚马逊店铺提升引流效果方面的独特作用与优势。 海外云手机&#xff0c;一种基于云端技术的虚拟手机&#xff0c;能够在单一硬件上…

Centos系统实用运维命令记录(持续更新)

本文记录Centos服务器常用的运维命令&#xff0c;备忘 查询当前内存占用最高(前10)的进程列表和占用比例&#xff0c;进程ID ps -eo pid,comm,%mem,cmd --sort-%mem | head -n 11注: 内存警报时定位问题时非常有用 查询占用某个端口号的进程id lsof -i :9000注: 后面的9000…

Ai绘画工具Stable Diffusion提示词如何使用

Stable Diffusion是一种基于深度学习的AI绘画工具&#xff0c;它可以根据用户提供的提示词&#xff08;prompt&#xff09;生成相应的图像。提示词是引导AI生成图像的关键&#xff0c;正确的使用和调试提示词对于获得满意的结果至关重要。本文将介绍如何使用和调试Stable Diffu…

let命令

let 命令 let 与 var 二者区别&#xff1a; 作用域不同&#xff1a;变量提升&#xff08;Hoisting&#xff09;&#xff1a;临时性死区重复声明&#xff1a; 联系&#xff1a;举例说明&#xff1a; 块级作用域 块级作用域的关键字使用 var&#xff08;无块级作用域&#xff09;…

JavaScript手写专题——图片懒加载、滚动节流、防抖手写

图片懒加载场景&#xff1a;在一些图片量比较大的网站&#xff08;比如电商网站首页&#xff0c;或者团购网站、小游戏首页等&#xff09;&#xff0c;如果我们尝试在用户打开页面的时候&#xff0c;就把所有的图片资源加载完毕&#xff0c;那么很可能会造成白屏、卡顿等现象&a…

算法练习第五十八天|739. 每日温度、496. 下一个更大元素

739. 每日温度 496. 下一个更大元素 I 每日温度 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatures.length;int[] res new int[length];//保留下标Deque<Integer> stack new LinkedList<>();stack.push(0);for(in…

ICode国际青少年编程竞赛- Python-2级训练场-range函数

ICode国际青少年编程竞赛- Python-2级训练场-range函数 1、 for i in range(4):Dev.turnLeft()Dev.step(i 1)2、 for i in range(4):Spaceship.step(i 1)Spaceship.turnRight()3、 for i in range(4):Spaceship.step(i 1)Dev.step(2)Dev.step(-2)4、 for i in range(1, 5)…

上海市计算机学会竞赛平台2022年1月月赛丙组三角形的判定

题目描述 给定三个正整数 &#x1d44e;a&#xff0c;&#x1d44f;b 与 &#x1d450;c&#xff0c;请判断它们是否能组成一个三角形。 输入格式 第一行&#xff1a;三个整数表示 &#x1d44e;a&#xff0c;&#x1d44f;b 与 &#x1d450;c。 输出格式 如果可以组成一…

【深度学习4】pip、conda换源

pip、conda换源 1. pip换源2. conda 换源 1. pip换源 临时使用镜像源安装&#xff0c;如下所示&#xff1a;some-package 为你需要安装的包名 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ some-package设置pip默认镜像源&#xff0c;升级 pip 到最新的版本 (&…

【深度学习】【Lora训练2】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

文章目录 一、如何为图片打标1.1. 打标工具1.1.1. 秋叶中使用的WD1.41.1.2. 使用BLIP21.1.3. 用哪一种 二、 Lora训练数据的要求2.1 图片要求2.2 图片的打标要求 三、 Lora的其他问题qa1qa2qa3qa4qa5 四、 对图片的处理细节4.1. 图片尺寸问题4.2. 图片内容选取问题4.3. 什么是一…