码龄10年 暂无认证

34133
访问
1
等级

8
获赞
3
评论

最新评论

  • 20240228阿⑤

    积分乍获得

  • 20231124ziher

    666

  • 20230909八月老师

    什麼時候發佈易語言支持庫呢

六.结构体指针数组的由来

Heart 2023-05-19 22:30:36 发布 358

分类专栏: 数据逆向 文章标签: 结构体 指针 数组

结构体指针数组的由来

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.判断数据是否为空号判断


Heart1
0 0 上传作业
X
    网友评论 0条评论 0人参与
    请登陆会员1

    表情

    评论列表

×