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*
?说得对。我只提到了常量指针的类型。