【问题标题】:Iterating through C-style array not using a pointer不使用指针迭代 C 样式数组
【发布时间】:2012-08-22 03:46:27
【问题描述】:

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

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

我无法理解我在代码块中遇到的错误。我收到了这份声明。

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

在这段代码中,我必须在不取消引用或使用 [] 运算符的情况下迭代数组。

【问题讨论】:

  • 数组不是指针! (它们会腐烂。)
  • “我必须在不取消引用或使用 [] 运算符的情况下迭代数组” - 为什么???
  • @KeithRandall:家庭作业
  • 如果是硬件,我会提到。正如我在帖子中谦虚地写的那样,我正在学习指针算术。

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


【解决方案1】:

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

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

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

1.指向一个常量内存位置的指针。 这是一个普通指针,但它指向一个本质上是常量的变量(实际上是只读变量)。这意味着它指向的变量的值不能通过它改变。通常它被用来指向一个像这样的常量变量。

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

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

2.Const 指向内存位置的指针。 这是一个指针,它只能指向整个程序中的一个内存位置。它指向的变量的值可以更改,但指针本身是恒定的。它是这样声明的。

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

你不能在程序后面做ptr = &amp;y ;。数组也可以隐式转换为指向内存位置的常量指针。所以它不能以这种方式增加或减少。 (如果你喜欢,你可以在这里阅读: What is array decaying?)

3.Constant 指向一个常量内存位置的指针。 这是一个指针,它本身是常量,也指向一个常量内存位置。它是这样声明的。

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

【讨论】:

  • RE“数组是一个常量指针”——technically not,我相信这样简化会伤害对数组的理解。 int a[6] 是六个整数。这些整数就在那里。你也可以得到一个指向其中一个的指针,&amp;a[0] 有一个快捷方式,但它不是指针,就像 int a; 不是指针一样。
  • 欢迎您编辑它.. 我这样说是为了向他解释一个简单的方法。他/她可能不知道衰变:)
  • tnx.我已经很好地解决了
  • 你提到了const T*T* constconst T* const,但没有提到T*
  • 说得对。我只提到了常量指针的类型。
【解决方案2】:

所以你总是可以这样做:

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

【讨论】:

  • 你应该解释为什么这个而不是OP所说的。
  • 我只是喜欢分发答案并让人们蒙在鼓里……这让我觉得自己很重要/优越。
  • 我宁愿你反其道而行之,解释原因而不给出答案。教人们思考,而不是简单地要求代码。
猜你喜欢
  • 2014-04-22
  • 2019-09-19
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多