Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;传递包含指针的常量结构-如何在值之间移动?_C++_Function_Pointers_Struct_Constants - Fatal编程技术网

C++ c++;传递包含指针的常量结构-如何在值之间移动?

C++ c++;传递包含指针的常量结构-如何在值之间移动?,c++,function,pointers,struct,constants,C++,Function,Pointers,Struct,Constants,有同样的效果。。常量似乎适用于不允许我修改其指针的结构,包括指针指向的值 我必须放下警钟吗?是否无法证明函数不修改数据 编辑:PBYTE void someFunction(const PBYTEImage* inputImage) 在minwindef.h或windef.h 很抱歉没有提及此事 我必须放下警钟吗?是否无法证明函数不修改数据 实际上,函数确实更改了参数数据,因为您正在增加inputImage.pixels。 因此,您可能希望存储inputImage.pixels,并对其

有同样的效果。。常量似乎适用于不允许我修改其指针的结构,包括指针指向的值

我必须放下警钟吗?是否无法证明函数不修改数据

编辑:
PBYTE

    void someFunction(const PBYTEImage* inputImage)
minwindef.h
windef.h

很抱歉没有提及此事

我必须放下警钟吗?是否无法证明函数不修改数据

实际上,函数确实更改了参数数据,因为您正在增加inputImage.pixels。 因此,您可能希望存储inputImage.pixels,并对其进行迭代

typedef unsigned char BYTE;   
typedef BYTE near *PBYTE;
void someFunction(常量PBYTEImage和inputImage)
{
PBYTE pPixels=输入图像像素;
对于(无符号整数x=0;x
首先,for循环的退出条件中有一个输入错误:您已经编写了

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;
    }
}
但应该是这样

inputImage*height
除此之外,你还没有告诉我们PBYTE是什么,但是从这一行

inputImage.height
我想你在什么地方

unsigned char y = *(inputImage.pixels);
所以PBYTE是一个指针。表情

typedef unsigned char* PBYTE;
确实尝试增加指针,像素。由于像素是结构的一个成员,而结构是作为常量传递的,因此会出现错误。因此,是的,如果要保持结构不变并增加指针,必须在函数定义中删除常量。从将inputImage作为引用传递到将其作为指针传递也没有帮助

我必须放下警钟吗?难道没有办法证明 函数是否不修改数据


从常量的角度来看,您可能希望是安全的,因为您只是移动一个指针,而没有触及它所指向的数据:没错,但在这种情况下,指针本身就是您的数据,您正在尝试更改它。所以你的函数会修改数据。

为什么不干脆
struct PBYTEImage{…}:
?什么是
PBYTE
<代码>字符*?您可能还想更改for循环…是否使用其他指针
PBYTE other=inputImage.pixels<代码>++其他。当前您的循环无效,您\读取
y
,对其不做任何操作。
PBYTE
是指向一个
字节(无符号字符)的指针@Ceris,为什么他需要说
struct PBYTEImage{…}
?OP希望使用
PBYTEImage
作为变量类型,而不是说
struct PBYTEImage
作为变量类型。这并没有错,函数会修改数据,即结构中的指针。常量指针和指向常量数据的指针之间存在差异。是否必须在函数末尾释放pPixel?递增后不能使用pPixel释放内存,因为它需要指向完全相同的位置。所以要么减少ppixel,要么干脆释放inputImage.pixels。我希望我能早点看到这条评论,我一直在努力找出函数调用程序中的崩溃,因为指向像素的原始指针已被移动。。。由于inputImage.pixels是从调用者发送的,并且我正在使用指向它的指针,如果我在pPixels末尾这样做-=inputImage.width*inputImage.height;我还需要释放像素吗?
PBYTE-pPixels=inputImage.pixels不分配任何内存。它们都是变量(指针)。只要删除时保持内存的原始偏移量,就可以使用这两种方法释放内存。因此,如果要在迭代后使用pPixels释放内存,必须调用
pPixels-=inputImage.width*inputImage.height以防止崩溃。添加了对PBYTE的Microsoft引用,感谢您指出我的输入错误。是的,这也是我的理解,正如你所说的,我正试图找到在代码中传递我的结构的最佳方式,同时明确表示函数不会修改数据。
typedef unsigned char* PBYTE;
inputImage.pixels += 1;