在Gary &禤浩焯Kaehler的"学习OpenCV“中,有一个关于CvMat矩阵结构的章节,其中包含以下示例代码(示例3-9:将所有元素相加在一个单通道矩阵中)。
float sum( const CvMat* mat ) {
float s = 0.0f;
for(int row=0; row<mat->rows; row++ ) {
const float* ptr = (const float *)(mat->data.ptr + row * mat->step);
for(int col=0; col<mat->cols; col++ ) {
s += *ptr++;
}
}
return( s );
}关于这段代码,有几件事我不理解,但它们可能是我多年没有使用C而不是OpenCV问题的结果。
const?由于ptr稍后在函数中递增,所以我不理解为什么声明为const。.ptr?作者指出,“当将指针计算到矩阵中时,请记住矩阵元素data是一个联合。因此,当取消引用该指针时,必须指示正确的联合元素,才能获得正确的指针类型。”那么,为什么不使用类型为fl的联合成员float*,以便代码行为
浮动* ptr = mat->data.fl +行*mat->步骤;而不是使用带有ptr类型的uchar*,而需要额外的强制转换?
发布于 2013-10-06 08:01:58
为什么是康斯特?由于ptr稍后在函数中递增,我不明白为什么声明它为const。
因为指针不是const,而是它所指向的对象。您正在讨论的内容将被编写为float *const ptr,但正如您所看到的,ptr并不是这样声明的。
为什么是.ptr?
因为工会的大小可能与float不同。想象一下这个数组:
union * union * union * union *
+0 +1 +2 +3 (correct)
+----------------+----------------+----------------+
union boundaries: | union | union | union |
+----------------+----------------+----------------+
float boundaries: | float |junk| float |junk| float |junk|
+----------------+----------------+----------------+
^ ^ ^ ^ ^
float * float * float * float * float *
+0 +1 +2 +3 +4
^--------- these are all wrong ----------^如果您得到一个指向第一个float的指针并在其上应用指针算法,如果union大于float,它将产生不正确的结果。
https://stackoverflow.com/questions/19206627
复制相似问题