我想知道#number1代码为什么不起作用 当我尝试使用增量运算符来显示数组中的下一个后续元素时。
但是#number2代码有效,并且它是相同的代码,但是在函数中
//# number 1 code
using namespace std;
int main(){
int arrays[5]={2,4,6,8,10};
for(int x=0;x<5;x++){
cout<<*arrays<<endl;
arrays++; //error: lvalue required as increment operand
}
}
//# number 2 code
using namespace std;
void display(int *arr,int size){
for(int x=0; x<5;x++){
cout<<*arr<<endl;
arr++; //This time no error!!!
}
}
int main(){
int arrays[5]={2,4,6,8,10};
display(arrays,5);
return 0;
}
答案 0 :(得分:3)
那是因为您不能更改数组的地址。 在执行数组++时,在#1号代码中,实际上是在尝试直接对存储数组基地址的变量进行操作。 您可以尝试的方法如下:
int *p = array;
p++;
在调用传递数组基地址#2的函数的情况下,您隐式执行了上面代码段中显示的操作。
答案 1 :(得分:1)
这是初学者的常见问题。 数组不是指针!。数组被隐式转换为指针。这就是混乱所在。考虑一下:
int array[] = {1, 2, 3};
std::cout << *array << '\n';
当我们*array
时,您认为正在发生什么。 解引用数组真的有意义吗?该数组将隐式转换为int *
,然后取消引用。那呢:
int array[] = {1, 2, 3};
array++;
std::cout << *array << '\n';
这不会编译(如您所知)。在此语句array++
中,array
并未隐式转换为指针。
将数组传递给接受指针的函数时,它们会转换为指针。这样就可以做到这一点:
int array[3] = {1, 2, 3};
display(array, 3);
数组是存储在堆栈中的一系列对象。您可以访问该对象序列作为指向第一个对象的指针。数组和指针都可以下标。它们具有许多相似之处,但根本不同。
要编译第一个示例,请使用x
下标数组:
for (int x = 0; x < 5; x++) {
std::cout << arrays[x] << '\n';
}
答案 2 :(得分:0)
使用:
int *arr = arrays;
arr++;
在代码1中。它会工作。这是因为您首先需要创建一个指向数组底部的指针,然后可以像第二个代码中那样将其递增,并且该指针具有传递给该函数的参数形式。