我想知道#number1代码怎么没有工作,因为我试图使用increment运算符来显示数组中的下一个元素。
但#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;
}
那是因为你无法改变数组的地址。在#number 1代码中执行array ++时,实际上是在尝试直接操作存储数组基址的变量。您可以尝试的是以下内容:
int *p = array;
p++;
在您调用传递数组的基址#number 2的函数的情况下,您隐式执行上面代码片段中显示的内容。
这是初学者的常见问题。数组不是指针!数组被隐式转换为指针。这就是混乱所在。考虑一下:
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';
}
使用 :
int *arr = arrays;
arr++;
在代码#1中。它会工作。这是因为你需要首先创建一个指向数组基础的指针,你可以像在第二个代码中那样递增,你有指针以函数的传递参数的形式。