C 语言结构体

news2024/9/23 7:32:13

本博客涉及的结构体知识有:

1.0:结构体的创建和使用

2.0:  typedef 关键字与#define 关键字的区别

3.0:  结构体成员的访问【地址访问与成员访问】

4.0: 结构体嵌套调用

5.0 数组访问赋值结构体成员

......


1.0:结构体的创建和使用

结构体类型和枚举类型一样,是一种用户自定义的数据类型,它可以使用一个变量来描述事物的多种属性,便于数据的管理,数据类型声明的语法格式:或者说->【结构是一些值的集合,这些值被称为成员变量,结构体中的成员可以是不同的变量类型 】,和数组相比结构体的数据类型更为的灵活,数组指的是一组相同类型的值的集合,数组的下标是从0开始的。

格式1:

// 结构体的声明格式
typedef struct
{
    成员列表
}structName_t;

注:成员列表中的成员并不是变量在什么的时候并不会开辟内存空间

内存空间的开辟要在创建结构体变量之后

 ***********************************
 *  结构体: 创建结构体案例
 *  参数  : 结构体成员 char name[20]; char tel[12];
 *  返回值: 无
 *  时间  : 2024/7/13 
 *  作者  : _沧浪之水_
 ************************************ 
**/
typedef struct
{
	char name[20];
	char tel[12];
	char sex[5];
	int high;
}People_t;

 格式2:

结构体变量的声明

struct Person 
{
​     // 成员列表
      char name[20];
      int age;
}struct_name_t;

上面的结构体是一个结构体数据类型,并不是一个变量,创建结构体类型的时候并不会开辟内存空间

struct Stu
{
​     // 成员列表
      char name[20];
      int age;
}s1,s2;
s1 与 s2 是 struct Stu 类型的变量(s1 s2 是结构体成员的全局变量)

格式3:

// 结构体成员变量声明
struct Point
{
	int x;
	int y;
	
}p1 = {2,3};

struct score
{
	int n;
	char ch;

};

struct Stu
{
	char name[20];
	int age;
	struct score s;

};

成员变量的初始化
int main()
{
   struct Stu s1 = {"8888",20,{100,'q'}};
   printf(%s %d %d %c,s1.name,s1.age,s1.n,s1.s.ch);

}

结构体变量的定义

/**
 ***********************************
 *  结构体: 结构体变量定义后同时进行赋值
 *  参数  : 无参数
 *  返回值: 无返回值
 *  时间  : 2024/7/13 
 *  作者  : _沧浪之水_
 ************************************
**/
People_t peo = { "张三","15863310892","男",181 };

2.0 typedef 关键字的使用

typedef关键关键字:用于定义一个已有关键字的别名,具体创建格式如下所示

/**
 ***********************************
 *  结构体: typedef 关键字的用法
 *  参数  : 无参数
 *  返回值: 无返回值
 *  时间  : 2024/7/13 
 *  作者  : _沧浪之水_
 ************************************
**/
typedef 数据类 名字

typedef uint8_t uint;

typedef unsigned char uchar;

typedef 关键字和define关键字的区别,两者都是给对象取一个别名增强程序的可读性【尽量防止程序中魔鬼数字的出现】,两者有如下的区别

1: 使用场景不同

  • typedef 关键字用于给数据类型定义别名
  • #define关键字又称为(宏定义) 用于给数字,表达式(写表达式时注意带上括号防止异常问题的出现),代码语句定义别名。

2:执行时机不同

  • typedef在编译阶段执行;
  • #define在预编译阶段执行;

3:定义方法不同

  • #define别名在替换对象的前面,并且定义后面不用加分号;
#define PI 3.14

#define MAX_NUM_LIST 9

typedef的别名在替换对象的后面,并且定义后面需要加分号;

typedef unsigned char uchar;

3.0:  结构体成员的访问

注:有指针访问和圆点运算符访问两种访问方式

使用圆点运算符并打印输出

    /**
     ***********************************
     *  结构体: 结构体成员变量访问
     *  参数  : 结构体成员访问
     *  返回值: 无
     *  时间  : 2024/7/13 
     *  作者  : _沧浪之水_
     ************************************
    **/

    // peo 是结构体变量,结构体变量创建后才会开辟内存控制,结构体变量初始化
	People_t peo = { "张三","15863310892","男",181 };
	// 浮点数在内存中不能精确的存储,结构体嵌套初始化
	recallStruct_t recal = { {"李四","15863310892","男",181},100, 88.8f };

	printf("%s %s %s %d\n", peo.name, peo.tel, peo.sex, peo.high);
	printf("%s %s %s %d %d %f\n", 
                 recal.p.name,
                 recal.p.tel,
                 recal.p.sex, 
                 recal.p.high,
                 recal.num,
                 recal.f);

使用指针访问【地址访问】

/**
 ***********************************
 *  结构体: 结构体传递地址调用
 *  参数  : *p 指针地址
 *  返回值: 无
 *  时间  : 2024/7/13 
 *  作者  : _沧浪之水_
 ************************************
**/
void Print(People_t  *p) 
{
	// 左边的是结构体指针 “结构体指针->成员变量”
	printf("%s %s %s %d\n", p->name, p->tel, p->sex, p->high);
}

注:以上的这种写法需要在主函数中进行调用


4.0: 结构体嵌套调用

#define  _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include <string.h>
#include "add.h"
#include <stdint.h>

/**
 ***********************************
 *  结构体: 创建结构体
 *  参数  : 结构体成员 char name[20]; char tel[12];
 *  返回值: 无
 *  时间  : 2024/7/13
 *  作者  : _沧浪之水_
 ************************************ 
**/
typedef struct
{
	char name[20];
	char tel[12];
	char sex[5];
	int high;
}People_t;

/**
 ***********************************
 *  结构体: 创建结构体
 *  参数  : 结构体成员,内部包含结构体【顺带变量初始化,结构体初始化】
 *  返回值: 无
 *  时间  : 2024/7/13
 *  作者  : _沧浪之水_
 ************************************
**/
typedef struct 
{
	People_t p;
	int num;
	float f;
}recallStruct_t;

/**
 ***********************************
 *  结构体: 结构体传递地址调用
 *  参数  : *p 指针地址
 *  返回值: 无
 *  时间  : 2024/7/13
 *  作者  : _沧浪之水_
 ************************************
**/
void Print(People_t  *p) 
{
	// 左边的是结构体指针 “结构体指针->成员变量”
	printf("%s %s %s %d\n", p->name, p->tel, p->sex, p->high);
}

/**
 ***********************************
 *  结构体: 结构体成员变量访问
 *  参数  : 结构体成员访问
 *  返回值: 无
 *  时间  : 2024/7/13
 *  作者  : _沧浪之水_
 ************************************
**/
void PrintTwo(People_t input) 
{
	// 左边的是结构体变量 “结构体变量.成员变量”
	printf("%s %s %s %d\n", input.name, input.tel, input.sex, input.high);
}

int main()
{
	// peo 是结构体变量,结构体变量创建后才会开辟内存控制,结构体变量初始化
	People_t peo = { "张三","15863310892","男",181 };
	// 浮点数在内存中不能精确的存储,结构体嵌套初始化
	recallStruct_t recal = { {"李四","15863310892","男",181},100, 88.8f };

	printf("%s %s %s %d\n", peo.name, peo.tel, peo.sex, peo.high);
	printf("%s %s %s %d %d %f\n", recal.p.name, recal.p.tel, recal.p.sex, recal.p.high, recal.num, recal.f);
	
	Print(&peo);
	PrintTwo(peo);
	return 0;
}

注:以上的注释编写方式仅限于更好的理解知识,实际的开发过程会更为规范,推荐书籍《高质量 C C++ 编程指南 》。

 注:上面的两种打印输出方式哪一种打印方式更好,结构体传递参数吧 “对象” 进行结构体传参的时PrintTwo() 这种参数传递方式方式时PrintTwo(peo),peo实际是一个对象已经在内存中开辟了一块内存空间,如果把对象作为实际参数传递给形参的时候“形参里面的内容实际上是实际参数的一份拷贝” 打印peo的时候打印输出的数据是一样的,空间和时间的浪费会降低程序的性能。【推荐使用地址传递的方式把参数的地址传递进去(地址的大小就是4-8字节)通过地址找到数据】参数传递的时候会压栈结构体传递参数的时候尽量传递结构体的地址节省时间和空间


5.0 数组方式给结构体成员赋值

#define  _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include <string.h>
#include "add.h"
#include <stdint.h>

#define MAX_LIST_NUM (sizeof(arrList) / sizeof(arrList[0]))

/**
 ***********************************
 *  结构体: 创建结构体
 *  参数  : 结构体成员 char name[20]; char tel[12];
 *  返回值: 无
 *  时间  : 2024/7/13
 *  作者  : _沧浪之水_
 ************************************ 
**/
typedef struct
{
	char name[20];
	char tel[12];
	char sex[5];
	int high;
}People_t;

static People_t arrList[] =
{
	{"Keil","122345625","男",180},
	{"Ling","122345625","女",185}
};

int main()
{
	uint8_t i = 0;
	for (i = 0; i < MAX_LIST_NUM; i++) 
	{
		printf("%s %s %s %d\n", 
			arrList[i].name, 
			arrList[i].tel, 
			arrList[i].sex, 
			arrList[i].high);
	}
	return 0;
}


6.0 结构体内存对齐

 ......

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

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

相关文章

33.异步FIFO IP核的配置、调用与仿真

&#xff08;1&#xff09;异步FIFO的配置过程&#xff1a; ps&#xff1a;异步fifo相比较同步fifo少一个实际深度 &#xff08;2&#xff09;异步FIFO的调用: module dcfifo (input wr_clk ,input rd_clk ,input [7:0] …

LT_0001_两数之和

一、题目描述 二、代码实现 2.1 暴力枚举 时间复杂度O(N^2) public static int[] towSum(int[] nums, int target) {for (int i 0; i < nums.length; i) {for (int j i 1; j < nums.length; j) {if (nums[i] nums[j] target) {return new int[]{i,j};}}}return n…

github actions方式拉取docker镜像

参考&#xff1a; https://wkdaily.cpolar.cn/archives/gc 注意github actions提供的免费虚拟机空间有限&#xff0c;空间不足会报错&#xff0c;查看大概语句有10来G 我在workflow file里加了df -h 运行查看磁盘情况&#xff1a; 通过pwd命令&#xff0c;可以知道运行目录/ho…

护网HW面试——redis利用方式即复现

参考&#xff1a;https://xz.aliyun.com/t/13071 面试中经常会问到ssrf的打法&#xff0c;讲到ssrf那么就会讲到配合打内网的redis&#xff0c;本篇就介绍redis的打法。 未授权 原理&#xff1a; Redis默认情况下&#xff0c;会绑定在0.0.0.0:6379&#xff0c;如果没有采用相关…

自然语言处理(NLP)——法国工程师IMT联盟 期末考试题

1. 问题1 &#xff08;法语&#xff09;En langue arabe lcrasante majorit des mots sont forms par des combinaisons de racines et de schmes. Dans ce mcanisme... &#xff08;英语&#xff09;In Arabic language the vast majority&#xff08;十之八九&#xff09; of…

JAVA自定义注释

interface 声明 package test; public interface InProgress { } InProgress public void calculateInterest(float amount, float rate) { } 带成员 public interface TODO {String value(); } InProgress //只有成员变量名有value时&#xff0c;值有给value赋值时可以这…

水的几个科学问题及引发的思考

水的几个科学问题及引发的思考 1、两个相同的容器A和B&#xff0c;分别装有同质量的水&#xff0c;然后&#xff0c;在A容器中加入水&#xff0c;在B容器中加入冰&#xff0c;如果加入水和冰的质量相同。问&#xff0c;容器B的水位将与容器A的水位相同吗&#xff08;假设冰未融…

Web 性能入门指南-1.5 创建 Web 性能优化文化的最佳实践

最成功的网站都有什么共同点&#xff1f;那就是他们都有很强的网站性能和可用性文化。以下是一些经过验证的有效技巧和最佳实践&#xff0c;可帮助您建立健康、快乐、值得庆祝的性能文化。 创建强大的性能优化文化意味着在你的公司或团队中创建一个如下所示的反馈循环&#xff…

永磁同步电机控制算法--基于 SVM 的无磁链环 DTC

永磁同步电机无磁链环 DTC 通过控制定子磁链交轴分量来直接控制转矩&#xff0c;不再要求控制磁链幅值恒定&#xff0c;省去了传统 DTC 中的磁链环&#xff0c;不仅转矩响应更快&#xff0c;有效抑制了转矩脉动&#xff0c;而且提高了电机功率因数。但无磁链环 DTC 方案仍采用传…

探索4D毫米波雷达和摄像头在自动驾驶中的潜力

随着自动驾驶技术的快速发展&#xff0c;关于各种传感器的必要性&#xff0c;尤其是LiDAR&#xff08;激光雷达&#xff09;与毫米波雷达结合摄像头的作用&#xff0c;激发了激烈的讨论。在这篇博客中&#xff0c;我们将探讨4D毫米波雷达和摄像头的组合是否可能成为自动驾驶车辆…

python爬虫网页解析模块及测试案例详解

xpath模块 xpath模块基本使用方法 测试网页 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"/><title>Title</title> </head> <body><ul><li id"l1" class"c1&q…

R语言安装devtools包失败过程总结

R语言安装devtools包时&#xff0c;遇到usethis包总是安装失败&#xff0c;现总结如下方法&#xff0c;亲测可有效 一、usethis包及cli包安装问题 首先&#xff0c;Install.packages("usethis")出现如下错误&#xff0c;定位到是这个cli包出现问题 载入需要的程辑包…

GESP CCF C++ 四级认证真题 2024年6月

第 1 题 下列代码中&#xff0c;输出结果是&#xff08; &#xff09; A. 12 24 24 12 B. 24 12 12 24 C. 12 12 24 24 D. 24 24 12 12 第 2 题 下面函数不能正常执行的是&#xff08;&#xff09; A. B. C. D. 第 3 题 下面程序…

博客前端项目学习day01

这里写自定义目录标题 登录创建项目配置环境变量&#xff0c;方便使用登录页面验证码登陆表单 在VScode上写前端&#xff0c;采用vue3。 登录 创建项目 检查node版本 node -v 创建一个新的项目 npm init vitelatest blog-front-admin 中间会弹出询问是否要安装包&#xff0c…

OZON夏季热卖产品有哪些,OZON夏季热卖新品

OZON平台在夏季的热卖产品种类繁多&#xff0c;涵盖了多个领域&#xff0c;主要包括但不限于以下几个方面&#xff0c;接下来看看OZON夏季热卖产品有哪些&#xff0c;OZON夏季热卖新品&#xff01;Top1 运动套装 Костюм спортивный Victorias Secret 商品id…

AI绘画Stable Diffusion 自制素材工具: layerdiffusion插件—透明背景生成工具

大家好&#xff0c;我是设计师阿威 今天给大家分享一款AI绘画的神级插件—LayerDiffusion。 Layerdiffusion是一个用于stable-diffusion-webui 的透明背景生成&#xff08;不是生成图再工具扣图&#xff0c;是直接生成透明背景透明图像&#xff09;插件扩展&#xff0c;它可以…

SpringBoot整合Java Mail实现发送邮件

SpringBoot整合Java Mail实现发送邮件 实现 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>发送邮件配置 这里使用qq邮箱发送邮件&#xff0c;需要…

TensorBoard ,PIL 和 OpenCV 在深度学习中的应用

重要工具介绍 TensorBoard&#xff1a; 是一个TensorFlow提供的强大工具&#xff0c;用于可视化和理解深度学习模型的训练过程和结果。下面我将介绍TensorBoard的相关知识和使用方法。 TensorBoard 简介 TensorBoard是TensorFlow提供的一个可视化工具&#xff0c;用于&#x…

visual studio开发C++项目遇到的坑

文章目录 1.安装的时候&#xff0c;顺手安装了C模板&#xff0c;导致新建项目执行出问题2.生成的exe&#xff0c;打开闪退问题3.项目里宏的路径不对&#xff0c;导致后面编译没有输出4. vs编译ui&#xff0c;warning跳过&#xff0c;未成功5.vs编译.h&#xff0c;warning跳过&a…

python自动化之用flask校验接口token(把token作为参数)

用到的库&#xff1a;flask 实现效果: 写一个接口&#xff0c;需要token正确才能登录 代码&#xff1a; # 导包 from flask import Flask,request,jsonify,json # 创建一个服务 appFlask(__name__) # post请求&#xff0c;路径&#xff1a;/query app.route(/query, met…