我有一个常量矩阵和向量作为输入的函数,我试图迭代列如下
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,但这使得它不容易阅读:(
答案 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_ptr
和b_ptr
指针设为const
,并在循环内为它们指定值。根据{{1}}属性,您无法更改指针指向的位置的值。