码龄10年
暂无认证
43373
访问
1
等级
8
获赞
3
评论
热门文章
-
一.某岛之人物对象及其加密函数解析
2654
-
一.《传奇M》装备栏遍历的突破口
2281
-
二.某龙端游中LUA的分析和调用
2036
-
一.窗口坐标与屏幕坐标
1757
-
一.《轩辕传奇》周围遍历之二叉树
1755
最新评论
-
20240228阿⑤
积分乍获得
-
20231124ziher
666
-
20230909八月老师
什麼時候發佈易語言支持庫呢
六.结构体指针数组的由来
Heart
2023-05-19 22:30:36 发布
423
分类专栏: 数据逆向 文章标签: 结构体 指针 数组
结构体指针数组的由来
1.我们前面几节课讲到了结构体
2.并讲了结构性数组
3.如果记忆力还好的同学肯定记得我们提及过一个弊端
4.就是当结构性数组的元素过多 会显得数组整个字节大小非常的大
5.同是我们定义数组的时候 大小是固定的 也就是当定义数组就已经申请了固定大小的内存了
6.也就是说 这么大的一片连续的内存 有可能申请失败的
7.那么怎么解决呢?
结构体指针数组
1.这里就要想到 如果我们用数组只存我们结构的地址 不存实体
2.那么 比如1000个元素 结构大小为12
3.存实体 那么就是12000个字节 存地址就是 4*1000 也就是4千个字节
4.从数字上 我们就知道申请4000个字节 要比 12000个字节容易的多
5.所以我们看看结构体指针是怎么写的
结构性指针的创建
#include typedef struct INFO
{
char c;
int id;
float f;
}INFO;
INFO *g_pNum[1000] = { 0 };
int main()
{
sizeof(g_pNum);//我们这里可以观察到字节是4000 如果不是地址那么就是12000字节
printf("Hello Heart");
return 0;
}存数据
1.其实之前我们再C语言实战项目中已经用到了结构体指针数据了
2.我们是需要申请一个结构体大小的内存,来把地址存入这个数组中就可以了
3.写法很简单的 其实我们之前已经用到过这样的代码
#include #include"stdlib.h"
#include "windows.h"
typedef struct INFO
{
char c;
int id;
float f;
}INFO;
INFO *g_pNum[100] = { 0 };
int main()
{
sizeof(g_pNum);
INFO *pINFO = (INFO*)malloc(sizeof(INFO));
ZeroMemory(pINFO,sizeof(INFO));
pINFO->c = 'H';
pINFO->id = 1001;
pINFO->f = 666.66f;
g_pNum[0] = pINFO;
printf("Hello Heart");
return 0;
}读数据
1.用法和一般的数组是没有区别的
2.只是里面存的是结构体实体的首地址
3.我们访问是需要
g_pNum[0];//我们知道g_pNum[0]得到的事指针 指向的是实体 需要用->来访问 实体的成员变量
printf("%c\n",g_pNum[0]->c);4.遍历和一般的数组遍历是一样的 没有任何区别
5.这里大家要注意
思考
1.我们判断当前元素是否没有数据 是有些繁琐的
2.这时候必须借助一个标志位来判断 比如某个成员变量等于0
#include #include"stdlib.h"
#include "windows.h"
typedef struct INFO
{
char c;
int id;
float f;
bool bUse;
}INFO;
INFO g_pNum[100] = { 0 };
int main()
{
sizeof(g_pNum);
g_pNum[0].c = 'H';
g_pNum[0].id = 1001;
g_pNum[0].f = 666.66f;
g_pNum[0].bUse = 1;
if (g_pNum[0].bUse==1)
{
printf("%c\n", g_pNum[0].c);
//才开始访问数据 表示有数据
}
printf("Hello Heart");
return 0;
}改进成了结构体指针数据
1.判断就根据当前元素的地址释放为空
2.就能直接判断当前元素是否有值了
#include #include"stdlib.h"
#include "windows.h"
typedef struct INFO
{
char c;
int id;
float f;
}INFO;
INFO *g_pNum[100] = { 0 };
int main()
{
sizeof(g_pNum);
INFO *pINFO = (INFO*)malloc(sizeof(INFO));
ZeroMemory(pINFO,sizeof(INFO));
pINFO->c = 'H';
pINFO->id = 1001;
pINFO->f = 666.66f;
g_pNum[0] = pINFO;
if (g_pNum[0])
{
printf("%c\n", g_pNum[0]->c);
//才开始访问数据 表示有数据
}
printf("Hello Heart");
return 0;
}总结好处
1.数组大小不臃肿 申请内存好申请
2.判断数据是否为空号判断
网友评论
0条评论 0人参与
评论列表
0
0