如何访问自定义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
相关产品推荐
相关产品推荐

