【问题标题】:Using traversal by pointers on const array使用 const 数组上的指针遍历
【发布时间】:2017-01-27 01:32:10
【问题描述】:

我正在尝试使用指针遍历一个常量整数数组。我的代码如下:

void printArrayPointer(const int arr[], int n){
    for (int *i = arr; i < arr + n; i++) {
        cout << *i << ' ';
    }
}

这给了我一个错误,告诉我从 const int* 到 int* 的转换无效。我知道如何使用按索引遍历来做到这一点(就像使用数组中元素的索引一样),但我正在尝试对这段代码使用指针。

【问题讨论】:

  • 听听编译器告诉你什么。为什么不将i 声明为指向const int 的指针?
  • 使用const int* 而不是int*
  • 那行得通。这是怎么可能的,因为我每次通过 for 循环时都清楚地增加 i ?
  • i不是 const 但它指向的是。您可以增加它但不能取消引用它并更改它。
  • @Evan 如果你声明了指针const int * const i;,你将无法递增指针

标签: c++ arrays pointers


【解决方案1】:

正如编译器已经告诉你的那样,该行有一个错误:

for (int *i = arr;...

arrconst int[]iint *。如果编译器允许使用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 << ' ';
    }
}

【讨论】:

    【解决方案2】:

    作为axiac said,你必须写for (const int* i ...,因为arr是const int*

    您仍然可以增加i 的原因是const int* 意味着i 处的内容无法更改,您仍然可以更改i 指向的内容。所以你不能改变数组中的值,但是你可以改变遍历它们的 const 指针。

    为了使您无法更改指针指向的内容,您必须像这样声明它:int* const i。然后您可以更改i 的内容,但不能更改i 指向的内容。你也可以做到两者都不能改变,可以写成const int* const i

    【讨论】:

      猜你喜欢
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 2012-11-06
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多