You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问自定义Pix与BitMap结构体的成员?

访问你定义的结构体成员的方法

嘿,别担心,访问你定义的Pix和BitMap结构体成员其实很简单,主要分两种场景,我给你一步步演示:

1. 直接访问结构体变量的成员

如果你定义的是结构体变量(不是指针),用*点操作符(.)*来访问成员:

示例代码:

#include <stdint.h>

// 你的结构体定义(重复一下方便参考)
#pragma pack(push, 1)
typedef struct Pix {
    uint16_t R, G, B;
    int32_t BW;
}Pix;
#pragma pack(pop)

#pragma pack(push, 1)
typedef struct BitMap {
    int16_t Signature; //文件类型(BM)
    int32_t Reserved1; //保留字段,必须为0
    int32_t Reserved2; //保留字段,必须为0
    int32_t DataOffSet; //像素数据偏移量
    int32_t Size; //剩余头文件大小
    int32_t Width; //BMP图像宽度(像素)
    int32_t Height; //BMP图像高度(像素)
}BitMap;
#pragma pack(pop)

int main() {
    // 定义一个Pix类型的变量
    Pix my_pixel;
    // 给成员赋值
    my_pixel.R = 0xFF;
    my_pixel.G = 0x00;
    my_pixel.B = 0x00;
    my_pixel.BW = 128;
    // 读取成员值
    uint16_t red = my_pixel.R;
    int32_t bw_value = my_pixel.BW;

    // 定义一个BitMap类型的变量
    BitMap my_bmp_header;
    // 赋值示例:BM的十六进制是0x4D42
    my_bmp_header.Signature = 0x4D42;
    my_bmp_header.Width = 1920;
    my_bmp_header.Height = 1080;
    // 读取示例
    int32_t bmp_width = my_bmp_header.Width;

    return 0;
}

2. 通过结构体指针访问成员

如果你用的是结构体指针(比如动态分配内存,或者从文件读取到指针指向的内存区域),就用*箭头操作符(->)*来访问:

示例代码:

#include <stdint.h>
#include <stdlib.h>

// 结构体定义同上,这里省略节省空间...

int main() {
    // 动态分配Pix结构体内存,得到指针
    Pix* pix_ptr = (Pix*)malloc(sizeof(Pix));
    if (pix_ptr != NULL) {
        // 通过指针给成员赋值
        pix_ptr->R = 0x00;
        pix_ptr->G = 0xFF;
        pix_ptr->B = 0xFF;
        pix_ptr->BW = 255;
        // 通过指针读取成员值
        uint16_t green = pix_ptr->G;

        // 用完记得释放内存,避免泄漏
        free(pix_ptr);
    }

    // 同样处理BitMap指针
    BitMap* bmp_ptr = (BitMap*)malloc(sizeof(BitMap));
    if (bmp_ptr != NULL) {
        // 标准BMP文件的像素数据偏移量通常是54
        bmp_ptr->DataOffSet = 54;
        bmp_ptr->Size = 40; // 标准信息头大小
        int32_t data_offset = bmp_ptr->DataOffSet;

        free(bmp_ptr);
    }

    return 0;
}

小注意点

  • 成员名是大小写敏感的,比如my_pixel.R不能写成my_pixel.r,不然编译器会报错找不到成员。
  • 你用了#pragma pack(push,1)来取消内存对齐,这个只会影响结构体在内存中的布局,完全不影响成员的访问方式,该怎么用.和->还是怎么用。

内容的提问来源于stack exchange,提问作者XxX_Code.Destroyer_XxX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:25:23