迭代const矩阵和向量

时间:2015-08-07 20:04:01

标签: c pointers matrix

我有一个常量矩阵和向量作为输入的函数,我试图迭代列如下

void matx_mut(const int *A, const int **B, unsigned int c, unsigned int a_col_start, unsigned int a_col_end,     unsigned int a_row_start, unsigned int a_row_end)
{
        unsigned int i
        int  *a_ptr, *b_ptr;
        // do initial processing

        for( i = a_col_start; i <= a_col_end; i++)
        {
            // some code 

            a_ptr = &A[a_col_start];
            b_ptr = &B[i][a_row_start];

            // more code 

        }
} 

但是,我收到以下警告“警告C4090:'=':不同的'const'限定词”。我无法将a_ptr和b_ptr更改为const,因为我在每次迭代时都会更改它们的值,对吗?

有一种解决此警告的好方法吗?除了在第二个for循环内声明两个指针之外。

我尝试使用初始指针A和B,但这使得它不容易阅读:(

1 个答案:

答案 0 :(得分:2)

根据c4090警告的说明,

  

操作中使用的变量是使用指定的修饰符定义的,该修饰符可防止在未经编译器检测的情况下对其进行修改。表达式无需修改即可编译。

     

当指向const或volatile项的指针被指定给未声明为指向const或volatile的指针时,可能会发出此警告。

原因:在您的代码中

 a_ptr = &A[a_col_start];
 b_ptr = &B[i][a_row_start];

目标指针是非const,源指针是。在这种情况下,如果您尝试修改(a_ptr的值,则根据标准,章节§6.7.3

  

如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为未定义.. [...]

您将面临未定义的行为。因此,由于通过非常量指针修改值,编译器会警告您稍后可能遇到的潜在UB。

这里的重点是,警告是有原因的,尝试解决可能的问题,不要试图压制它。

另外,我认为,你错过了对const类型限定符的理解。如果是

这样的定义
 const int * a_ptr;

a_ptr不是常量*a_ptr是。因此,您可以将a_ptrb_ptr指针设为const,并在循环内为它们指定值。根据{{​​1}}属性,您无法更改指针指向的位置的值。