不使用指针迭代C风格的数组

时间:2012-08-27 16:15:15

标签: c++ arrays pointers compiler-errors const-pointer

我正在学习指针算术并且有一段代码在很长一段时间内给我错误。任何帮助将不胜感激。(我无法在SO上找到它)

int arr [] = {1, 2, 3, 4, 5} ;
for (int i = 0 ; i < 5 ; i++)
{
    cout << *arr ;
    arr++ ;
}
cout << *arr << endl ;

我无法理解我在codeblocks中遇到的错误。我收到了这个声明。

    error: lvalue required as increment operand|
    ||=== Build finished: 1 errors, 0 warnings ===|

在此代码中,我必须迭代数组而不使用解除引用或使用 [] 运算符。

2 个答案:

答案 0 :(得分:8)

当您尝试增加数组时,您收到此错误。它是无效的,因为在c ++中,数组的名称可以隐式转换为指向第一个索引的常量指针。你不能增加一个数组,因为数组是一个容器,增加一个容器是没有意义的。

要完全回答你的问题,我需要解释一些事情。让我试试,其他人可以加入。

请记住,常量指针有三种类型。

1.Pointer到一个恒定的内存位置。 这是一个普通的指针,但它指向一个本质上是常量的变量(只读变量infact)。这意味着它指向的变量值不能通过它来改变。通常情况下,它使用像这样的常量变量。

const int x = 10 ;
const int *ptr = & x ; 

这里,你不能做*ptr = 5 ;因为指针指向一个常量变量。

2.Const指向内存位置的指针。 这是一个指针,它可以指向整个程序中只有一个内存位置。它指向的变量的值可以改变,但指针本身是常量。它被宣布为这样。

int x = 10, y = 5 ;
int * const ptr = &x ;

您不能在程序中稍后执行ptr = &y ;。数组也可以隐式转换为指向内存位置的常量指针。所以它不能以这种方式递增或递减。 (如果你愿意,你可以在这里阅读: What is array decaying?

3.指向常量内存位置的常量指针。 这是一个指针,它本身是常量,并指向一个恒定的内存位置。它被宣布为这样。

const int x = 8 ;
const int * const ptr = &x ;

这意味着您既不能将指针指向除初始化位置之外的任何位置,也不能更改其指向的位置的值。

我希望这个概念现在非常明确。现在回答你的问题:你想通过指针算法打印数组,但你不能增加数组本身。因此,实现此目的的一个解决方案是创建另一个指针(正常的指针)并为其分配数组的第一个索引的地址。然后,您可以递增,递减或更改该数组的值。这样的事情。

int arr [] = {1, 2, 3, 4, 5} ;
int *ptr = arr ;
for (int i = 0 ; i < 5 ; i++)
{
    cout << *ptr << " " ;
    ptr++ ;
}

答案 1 :(得分:-1)

所以你总能做到:

int arr [] = {1, 2, 3, 4, 5} ; 
int *a = arr;
for (int i = 0 ; i < 5 ; i++) 
{     
  cout << *a ;     
  a++ ; 
}