C++ 不使用指针遍历C样式数组

C++ 不使用指针遍历C样式数组,c++,arrays,pointers,compiler-errors,const-pointer,C++,Arrays,Pointers,Compiler Errors,Const Pointer,我正在学习指针算法,有一段时间有一段代码给了我错误。任何帮助都将不胜感激 在这段代码中,我必须在不取消引用或使用[]运算符的情况下迭代数组。当您尝试增加数组时,会出现此错误。它是无效的,因为在C++中,数组的名称可以隐式地转换为指向第一个索引的常数指针。不能递增数组,因为数组是容器,递增容器毫无意义 为了完整地回答你的问题,我需要解释一些事情。让我试试,其他人可以加入 请记住,常量指针有三种类型 1.指向恒定内存位置的指针。 这是一个普通指针,但它指向一个本质上是常量的变量(只读变量)。这意味着

我正在学习指针算法,有一段时间有一段代码给了我错误。任何帮助都将不胜感激


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

当您尝试增加数组时,会出现此错误。它是无效的,因为在C++中,数组的名称可以隐式地转换为指向第一个索引的常数指针。不能递增数组,因为数组是容器,递增容器毫无意义

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

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

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

const int x = 10 ;
const int *ptr = & x ; 
int x = 10, y = 5 ;
int * const ptr = &x ;
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++ ;
}
在这里,您不能执行
*ptr=5因为指针指向常量变量

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

const int x = 10 ;
const int *ptr = & x ; 
int x = 10, y = 5 ;
int * const ptr = &x ;
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++ ;
}
您不能执行
ptr=&y稍后在程序中。数组也可以隐式转换为指向内存位置的常量指针。因此,它不能以这种方式递增或递减。
(如果您愿意,可以在此处阅读:
)

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

const int x = 10 ;
const int *ptr = & x ; 
int x = 10, y = 5 ;
int * const ptr = &x ;
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++ ;
}
这意味着您不能将指针指向初始化位置以外的任何位置,甚至不能更改它指向的位置的值

我希望这个概念现在已经非常清楚了。现在回答您的问题:您希望通过指针算法打印数组,但不能增加数组本身。因此,一种解决方案是创建另一个指针(普通指针),并为其分配数组第一个索引的地址。然后可以增加、减少或更改该数组的值。像这样的

const int x = 10 ;
const int *ptr = & x ; 
int x = 10, y = 5 ;
int * const ptr = &x ;
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++ ;
}
intarr[]={1,2,3,4,5};
int*ptr=arr;
对于(int i=0;i<5;i++)
{

cout所以你可以一直这样做:

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

cout数组不是指针!(它们会衰减。)“我必须在不取消引用或使用[]运算符的情况下迭代数组”-为什么???@KeithRandall:家庭作业作业如果是hw,我会提到。我正在学习指针算术,正如我在帖子中谦卑地写道的那样。你应该解释为什么会这样,而不是OP所说的。我只是喜欢分发答案,让人蒙在鼓里……这让我觉得自己很重要/优越。我宁愿你做相反的事情,解释一下这就是为什么,不要给出答案。教人们思考,而不是简单地要求代码。RE“数组是一个常量指针”,我相信这样简化会损害对数组的理解。
int a[6]
是六个整数。这些整数就在那里。你也可以得到一个指向其中一个的指针,还有一个
&a的快捷方式[0]
,但它不是一个指针,就像
int a;
不是指针一样。欢迎你编辑它..我这样说是为了给他一个简单的解释。他/她可能不知道衰变:)tnx。我得到了很好的解决方案。你提到了
常数T*
常数T*常数
常数T*常数
,但没有m关于
T*
?说得对。我只提到了常量指针的类型。