gpt4 book ai didi

c++ - 不使用指针遍历 C 风格的数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:35 25 4
gpt4 key购买 nike

我正在学习指针算术,并且有一段代码让我错误了很长一段时间。任何帮助将不胜感激。(我在 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 ===|

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

最佳答案

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

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

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

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

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

关于c++ - 不使用指针遍历 C 风格的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com