使用指针以外的方法遍历C风格数组

4

我正在学习指针算术,并有一段代码已经给我带来了一些错误,一直找不到解决方法。如果有帮助,我将非常感激。(我在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 ===|

在这段代码中,我需要迭代数组而不使用解引用或使用[]运算符。

5
数组不是指针!(它们会衰变。) - chris
2
我必须在不使用解引用或[]运算符的情况下迭代数组 - 为什么? - Keith Randall
@KeithRandall:作业任务 - Mooing Duck
如果是硬件问题,我会提到的。我正在学习指针算术,正如我在帖子中谦虚地写道。 - Sasha
2个回答

9
您会收到此错误,因为您试图增加数组。这是无效的,因为在c++中,数组的名称可以被隐式转换为指向第一个索引的常量指针。您不能增加数组,因为数组是一个容器,增加容器没有意义。
要完全回答您的问题,我需要解释一些事情。让我尝试一下,其他人可以补充。
请记住,有三种类型的常量指针。
1.指向常量内存位置的指针。 这是一个普通指针,但它指向一个本质上是常量的变量(实际上是只读变量)。这意味着通过它指向的变量的值不能通过它来更改。通常用于指向常量变量。
const int x = 10 ;
const int *ptr = & x ; 

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

2.指向内存位置的常量指针。 这是一个指针,在整个程序中只能指向一个内存位置。它指向的变量的值可以更改,但指针本身是常量。它的声明方式如下。

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

您不能在程序后面执行 ptr = &y ; 这样的操作。数组也可以被隐式转换为指向内存位置的常量指针,因此不能以这种方式进行递增或递减。 (如果您愿意,可以在此处阅读有关此内容的更多信息: 什么是数组衰减?

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++ ;
}

2
关于“数组是常量指针”的说法,从技术上讲并不准确,我认为过于简化会影响对数组的理解。int a[6]表示六个整数,这些整数就在那里了。你也可以获取其中一个整数的指针,&a[0]有一个快捷方式,但并不像int a;那样是指针。 - user395760
我这么说是为了以简单易懂的方式向他/她解释。他/她可能不知道什么是衰减 :) - Coding Mash
我已经很好地找到了解决方案。 - Sasha
你提到了 const T*T* constconst T* const,但没有提到 T* - Mooing Duck
我只是提到了常量指针的类型。 - Coding Mash

-1

所以你总是可以这样做:

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

7
你应该解释为什么是这样的而不是原帖中所说的那样。 - Mooing Duck
我只是喜欢提供答案并让人们处于黑暗中...这让我感觉很重要/优越。 - poy
4
我宁愿你做相反的事情,解释为什么不展示答案。教会人们思考而不是简单要求代码。 - Mooing Duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接