服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言简明清晰讲解结构体

C语言简明清晰讲解结构体

2022-11-21 15:33_雪菜肉丝面_ C/C++

C语言结构体(Struct)从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由 int、char、float 等基本类型组成的。你可以认为结构体是一种聚合类型

本质

结构体本质上就是一些值的集合。

简单使用

#include <stdio.h>
struct User {
	char uName[20];
	char uPass[20];
};
int main() {
	struct User u1 = {
		"abc","123"
	};
	printf("%s\n", u1.uName);
	printf("%s\n", u1.uPass);
	return 0;
}

效果:

C语言简明清晰讲解结构体

 

一些写法

声明之后,可以立即创建实例。

也可以单独声明。

#include <stdio.h>
struct User {
	char uName[20];
	char uPass[20];
} u1, u2, u3;
struct User u4;
int main() {
	struct User u5;
	return 0;
}

匿名结构体:我用了,你们别想再用。

struct {
	char uName[20];
	char uPass[20];
}x;

 

我套我自己

只能套指针,因为空间有限。

举例:链表。

#include <stdio.h>
struct Node {
	int val;
	struct Node* next;
};
int main() {
	struct Node a = { 333,NULL };
	struct Node b = { 666,&a };
	printf("%d\n", (*b.next).val);
	return 0;
}

效果:

C语言简明清晰讲解结构体

 

内存对齐

结构体放成员,是一个一个放的。

第一个放到首个地址处。

第二个开始,计算一个对齐数,该数是以下两个值的较小者:

1,VS的默认值,8。

2,该成员所占字节数。

实际的偏移量是对齐数的整数倍。

最后,结构体的大小是最大对齐数的整数倍。

举例-int char char

#include <stdio.h>
struct A {
	int a;
	char b;
	char c;
};
int main() {
	struct A a = { 1,1,1 };
	printf("%lld", sizeof(a));
	return 0;
}

效果:8

C语言简明清晰讲解结构体

图解:

int放在首位。

char占1字节,直接放。

第二个char也是。

最后长度,按int的字节数的整数倍,也就是8。

C语言简明清晰讲解结构体

举例-char int char

#include <stdio.h>
struct A {
	char b;
	int a;
	char c;
};
int main() {
	struct A a = { 1,1,1 };
	printf("%lld", sizeof(a));
	return 0;
}

效果:12

C语言简明清晰讲解结构体

图解:

char直接放。

int从第四个开始放。

char直接放。

最后长度:从9开始第一个4的倍数,12。

C语言简明清晰讲解结构体

举例-char char int

#include <stdio.h>
struct A {
	char b;
	char c;
	int a;
};
int main() {
	struct A a = { 1,1,1 };
	printf("%lld", sizeof(a));
	return 0;
}

效果:8

C语言简明清晰讲解结构体

图解:两个char直接放。

int从下一个4的整数倍,也就是第五个开始放。

最后长度:从8开始第一个4的倍数,8。

C语言简明清晰讲解结构体

 

由结构体指针访问成员

就是一种箭头的写法。

#include <stdio.h>
struct A {
	int a;
};
int main() {
	struct A a = { 333 };
	struct A* b = &a;
	printf("%d\n", b->a);
	return 0;
}

效果:

C语言简明清晰讲解结构体

到此这篇关于C语言简明清晰讲解结构体的文章就介绍到这了,更多相关C语言结构体内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_37284843/article/details/124503537

延伸 · 阅读

精彩推荐
  • C/C++双缓冲解决VC++绘图时屏幕闪烁

    双缓冲解决VC++绘图时屏幕闪烁

    相信很多人在做图形界面开发时,常常会遇到屏幕闪烁的情况,当然我也不例外,下面我们就来详细探讨下这个问题的解决办法...

    C++教程网11032021-03-05
  • C/C++C++/GoLang如何实现自底向上的归并排序

    C++/GoLang如何实现自底向上的归并排序

    这篇文章主要给大家介绍了关于C++/GoLang如何实现自底向上的归并排序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    NothingLeft了11062021-09-26
  • C/C++C++ 类的继承与派生实例详解

    C++ 类的继承与派生实例详解

    这篇文章主要介绍了 C++ 类的继承与派生实例详解的相关资料,需要的朋友可以参考下...

    chaibubble4472021-05-20
  • C/C++C++ 控制台弹出文件管理对话框案例

    C++ 控制台弹出文件管理对话框案例

    这篇文章主要介绍了C++ 控制台弹出文件管理对话框案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    汪蛋9462021-10-19
  • C/C++C++中的常量定义小结

    C++中的常量定义小结

    在C++中,并不提倡使用#define定义一个常量。#define本质上是一个预处理器指令,它仅仅表示使用一个串代替别一个串而已。也就是说,#define定义的常量从未...

    Peter8710162021-03-07
  • C/C++VS2019 Nuget找不到包的问题处理

    VS2019 Nuget找不到包的问题处理

    这篇文章主要介绍了VS2019 Nuget找不到包的问题处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    一级菜鸟10972021-08-29
  • C/C++C++之默认参数详解

    C++之默认参数详解

    这篇文章主要介绍了C++的默认参数,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助...

    ALL IN C9402022-02-17
  • C/C++深入理解c语言数组

    深入理解c语言数组

    这篇文章主要介绍了c语言数组,有需要的朋友可以参考一下...

    C语言教程网8082021-01-11