首页 > 其他分享 >自定义类型 ——结构体

自定义类型 ——结构体

时间:2024-12-09 10:33:56浏览次数:6  
标签:struct 自定义 int s1 char peo printf 类型 结构

定义:

结构是一些值的集合,成员类型可以不一样;

//结构体定义:
struct peo
{
	char name[20];
	int age;
	char sex[6];
} x, arr[20],* p;

// struct peo 是自定义的类型名,类似于int ,char
// x是这个类型的全局变量,
// arr[20]是这个类型的数组
// p 是struct peo*型指针

匿名结构体:

// 匿名结构体 : 这个结构体只能使用一次
struct
{
	int age;
	char name[20];
} p1;

int main()
{
//因为在创建结构体的时候已经创建了p1,所以可以用
p1={18,"lisi"};

//但是我们不能再创建变量
return 0;
}

结构体与 typedef :

//结构体与 typedef(重命名)

typedef struct peo
{
	int age;
	char name[20];
}peo_,* point;

 // 相当于 typedef struct peo peo_;
 // 相当于 typedef struct peo* point;
 // struct peo s1 == peo_ s1;  peo_ 就是struct peo类型
 // struct peo * p == point p; point 就是struct peo* 型

结构体变量的定义与初始化:

//结构体变量的定义和初始化
// p1,p2 都是全局变量,而p3,p4,p 是局部变量

struct peo
{
	char name[20];
	int age;
} p1={"lisi",18};

struct peo p2 = { "zhangsan",20 };

struct stu
{//结构体里面套结构体:
	struct peo p4;
	int math;
	int Eng;
};

int main()
{
	struct peo s3 = { "wanger",30 };
	
	struct stu p = { {"zhuwu,24"},90,60 };

   	printf("%s %d %d %d\n", p.p4.name, p.p4.age, p.math, p.Eng);


	return 0;
}

内存对齐:

(求结构体所占内存大小)

#include<stdio.h>
#include<stddef.h>
struct s1
{
	char c1; 
	int i;  
	char c2; 
};
struct s2
{
	char c1;
	char c2;
	int i;
};

int main()
{
	struct s1 a;
	struct s2 b;
	printf("%d\n", sizeof(a));
	// 12
	printf("%d\n", sizeof(b));
	// 8
// offsetof 是宏,可以求成员在结构体中的偏移量 <stddef.h>
	printf("%d ", offsetof(struct s1, c1));
	printf("%d ", offsetof(struct s1, i));
	printf("%d \n", offsetof(struct s1, c2));
	// 0 4 8
	printf("%d ", offsetof(struct s2, c1));
	printf("%d ", offsetof(struct s2, c2));
	printf("%d \n", offsetof(struct s2, i));
	// 0 1 4
	return 0;
}

struct s3
{
	double d;
	char c;
	int i;
};

//16

struct s4
{
	char c1;
	struct s3 S;
	double d;

};

//32

为什么这么设计呢?

其实是在用空间换取时间,当不进行对齐的时候,读取一个完整的数据要对内存做两次访问,而对齐的话,只需要进行一次访问。

为了节省空间:尽量占用空间小的成员集中在一起,

像s1和s2,虽然里面成员类型相同,但s1所占空间远大于s2。

修改默认对齐数:

使用 #pragma  (一般设置为 2 的倍数)

#pragma pack(4)

struct S1
{
	int i;
	double d;
};

//恢复默认对齐数
#pragma pack()

struct S2
{
	int i;
	double d;
};

int main()
{
	printf("%d\n", sizeof(struct S1)); // 12
	printf("%d\n", sizeof(struct S2)); // 16

	return 0;
}

结构体传参:

struct S
{
	int arr[10];
	int i;
};

void print_1(struct S as)
{
	for (int i = 0; i < 4; i++)
		printf("%d ", as.arr[i]);
	printf("%d\n", as.i);
}

void print_2(const struct S* ps)
{
	for (int i = 0; i < 4; i++)
		printf("%d ", ps->arr[i]);
	printf("%d\n", ps->i);
}

int main()
{
	struct S s1 = { {1,2,3,4},66 };
	//传值
	print_1(s1);
	//传地址
	print_2(&s1);

	return 0;
}

第①种是将s1的值拷贝给临时变量as,又调用了空间;

第②种是将s1的地址给ps,通过地址访问其中的每个数据,加上const 修饰,保证不能随意被修改

so   结构体传参  的时候最好  传地址

标签:struct,自定义,int,s1,char,peo,printf,类型,结构
From: https://blog.csdn.net/weixin_65994469/article/details/144325252

相关文章

  • 三十四 Home Assistant 创建自定义面板
    创建自定义用户界面如果你想使用自己的状态卡片,且不将代码合并到home-assistant-polymer中,你可以创建自己的实现。将元素源文件及其依赖项放在HomeAssistant配置目录下的www/custom_ui/目录中。例如,如果要为light域创建一个名为my_custom_light_card的状态卡片,将my_custo......
  • 使用std算法库:使用find算法来处理基础类型与类对象
    在C++的std库中,提供了不少基础的算法工具库,比如最基本的查找,排序等,基本上都是封装了性能极高的查找和排序算法,基本上不需要自己再去琢磨和手写各种计算机算法了,比如快排什么的,直接使用即可。不过这些算法库基本用法挺简单,在基础用法的基础上,还是有一些厉害一点的用法。基......
  • 怎样写出优雅的HTML结构?
    写出优雅的HTML结构涉及多个方面,最终目标是创建语义化、结构良好、易于维护和高性能的代码。以下是一些关键原则和最佳实践:1.语义化标签:使用合适的HTML5标签:选择最能表达内容含义的标签。例如,用<article>表示文章,用<aside>表示侧边栏,用<nav>表示导航,而不是泛泛地使用<div>......
  • 如何在PbootCMS中添加自定义的表单字段?
    在PbootCMS中添加自定义的表单字段可以通过修改控制器文件和模板文件来实现。以下是详细的步骤和注意事项:定位文件位置:需要修改的文件路径是/APPs/home/controller/MessageController.php。使用文本编辑器或IDE打开该文件。查找相关代码:在MessageController.php文件中......
  • 求解赫夫曼编码的算法 数据结构算法6.12、6.13
    一.问题描述定义赫夫曼树和赫夫曼编码的存储结构,并写出求解赫夫曼编码的算法。二.问题分析1.赫夫曼树的逻辑结构赫夫曼树(HuffmanTree)是一种用于数据压缩的二叉树,也称为最优二叉树。其逻辑结构主要包括以下特点:节点类型:赫夫曼树包含两种类型的节点,即内部节点(也称为非叶子......
  • 【Java】自定义注解
    注释和注解不一样注释是给程序员看的,注解是给程序看的需要理解Socket,tomcat等内容一、什么是注解1.注解的作用①:注解一般用于对程序的说明,就像注释一样,但是区别是注释是给人看的,但是注解是给程序看的。②:让编译器进行编译检查的作用,比如下边这个@Override注解是重写的意......
  • 数据结构 (33)选择类排序
    前言    数据结构中的选择类排序主要包括简单选择排序(也称为选择排序)和堆排序。一、简单选择排序基本思想:简单选择排序是一种直观易懂的排序算法。它的工作原理是,在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最......
  • 数据结构 (34)归并排序
    前言    归并排序(MergeSort)是一种高效、稳定的排序算法,它采用分治法的思想,将待排序的序列分为若干个子序列,然后对这些子序列进行排序,最后再将排好序的子序列合并成一个完整的有序序列。一、基本思想    归并排序的核心思想是分治法,即将大问题分解为小问题......
  • 16.在 Vue 3 中使用 OpenLayers 实现自定义地图缩放控件
    前言在前端开发中,地图交互是一个常见且重要的需求。默认情况下,OpenLayers提供了丰富的控件(如缩放、旋转、属性标注等),但有时我们需要根据项目需求自定义交互逻辑,比如禁用默认缩放控件并实现自己的按钮式缩放功能。本文将带大家实现一个自定义地图缩放的功能,通过Vue3的Com......
  • JS进阶DAY3|事件(一)事件监听及事件类型
    目录一、事件监听方式(绑定)1.1DOM0级事件1.2 DOM2级事件1.3区别二、事件类型2.1鼠标事件2.2键盘事件2.3焦点事件2.4表单事件2.5加载和卸载事件2.6滚动事件2.7触摸事件(在支持触摸的设备上)一、事件监听方式(绑定)1.1DOM0级事件 直接将函数赋值给DOM......