我正在尝试使用指针循环访问一个常量的整数数组。我的代码如下:
void printArrayPointer(const int arr[], int n){
for (int *i = arr; i < arr + n; i++) {
cout << *i << ' ';
}
}
这给了我一个错误,告诉我从 const int* 到 int* 的转换无效。我知道如何使用按索引遍历来做到这一点(就像使用数组中元素的索引一样),但我正在尝试为此代码使用指针。
正如编译器已经告诉您的那样,该行中存在一个错误:
for (int *i = arr;...
arr
是const int[]
,i
是int *
。如果编译器允许用const int *
初始化i
则后续代码可以使用i
更改存储在a
中的const
值,因为i
是指向非常量数据的指针。这就是代码无法编译并且编译器在错误消息中告诉您的原因。
您必须将i
声明为const int *i
,它将起作用。
void printArrayPointer(const int arr[], int n){
for (const int *i = arr; i < arr + n; i++) {
cout << *i << ' ';
}
}
正如 axiac 所说,你必须写for (const int* i ...
因为 arr 是一个const int*
。
您仍然可以递增i
的原因是,const int*
意味着i
的内容无法更改,您仍然可以更改i
指向的内容。因此,您无法更改数组中的值,但可以更改遍历这些值的 const 指针。
若要使其无法更改指针指向的内容,必须像这样声明它:int* const i
。然后,您可以更改i
的内容,但不能更改i
指向的内容。您也可以将其设置为两者都无法更改,这可以写为const int* const i
.