c ++传递包含指针的const结构 - 如何在值中移动?

时间:2015-01-15 23:18:38

标签: c++ function pointers struct const

    typedef struct {
        unsigned int width;
        unsigned int height;
        PBYTE pixels;
    } PBYTEImage;

    void someFunction(const PBYTEImage& inputImage)
    {
        for (unsigned int x = 0; x < inputImage.width*inputImage.height; x++) 
        {
            unsigned char y = *(inputImage.pixels);
->          inputImage.pixels += 1;
        }
    }

Error: expression must be a modifiable value

我是否修改了PBYTE的内容?我以为inputImage.pixels += 1;只会将指针PBYTE推进到下一个值......这是正确的吗?

想要什么:

  • 结构的内容不应由函数

  • 修改
  • 该函数应该能够读取结构,并在读取数据时推进指针PBYTE

我认为我不能将struct中的项目作为const,因为调用者必须分配它们的值。

最好的方法是什么?

    void someFunction(const PBYTEImage* inputImage)

具有相同的效果..似乎const适用于不允许我修改其指针的结构,包括指针指向的值......

我是否必须丢弃常量?有没有办法证明该功能不会修改数据?

修改:PBYTE

typedef unsigned char BYTE;   
typedef BYTE near *PBYTE;

minwindef.hwindef.h

中定义

很抱歉没有提到它

2 个答案:

答案 0 :(得分:2)

  

我是否必须丢弃常量?有没有办法证明该功能不会修改数据?

实际上,您的函数确实会更改参数数据,因为您正在递增inputImage.pixels。 所以你可能想要存储inputImage.pixels并重复它。

void someFunction(const PBYTEImage& inputImage)
{
    PBYTE pPixels = inputImage.pixels;
    for (unsigned int x = 0; x < inputImage.width*inputImage*height;) 
    {
        unsigned char y = *pPixels;
        pPixels += 1;
    }
}

答案 1 :(得分:0)

首先,你的for循环的退出条件中有一个拼写错误:你已经写了

inputImage*height

但它应该是

inputImage.height

除此之外,您还没有告诉我们PBYTE是什么,但是从这一行开始

unsigned char y = *(inputImage.pixels);

我想你的某个地方

typedef unsigned char* PBYTE;

所以PBYTE是一个指针。表达式

inputImage.pixels += 1;

确实尝试增加指针,像素。由于像素是结构的成员,并且您的结构作为const传递,因此您将收到错误。所以是的,如果你想保持你的结构不变并增加指针,你必须在函数定义中删除const。从传递inputImage作为引用更改为将其作为指针传递也不会有帮助。

  

我是否必须丢弃常量?有没有办法证明这一点   函数不修改数据?

也许你期望从一个整体的角度来看是安全的,因为你只是移动指针而不是触及它所指向的数据:那是对的,但在这种情况下指针本身是你的数据,你正试图改变它。因此,您的功能修改数据。