0

在 Gary Bradski 和 Adrian Kaehler 的“ Learning 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 问题的结果。

  1. 为什么const?由于ptr稍后在函数中递增,我不明白为什么要声明它const

  2. 为什么.ptr?作者指出,“在计算指向矩阵的指针时,请记住矩阵元素data是联合。因此,在取消引用此指针时,必须指明联合的正确元素,才能获得正确的指针类型。 " 那么为什么不使用fl带有类型的联合成员,float*以便代码行是

    float* ptr = mat->data.fl + row * mat->step;
    

而不是ptr使用类型uchar*并需要额外的演员表?

4

1 回答 1

1

为什么是常量?由于 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.

于 2013-10-06T08:01:58.827 回答