数组和指针

问题描述 投票:0回答:3

我想知道#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;
}
c++ pointers
3个回答
3
投票

那是因为你无法改变数组的地址。在#number 1代码中执行array ++时,实际上是在尝试直接操作存储数组基址的变量。您可以尝试的是以下内容:

int *p = array;
p++;

在您调用传递数组的基址#number 2的函数的情况下,您隐式执行上面代码片段中显示的内容。


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

0
投票

使用 :

int *arr = arrays;
arr++;

在代码#1中。它会工作。这是因为你需要首先创建一个指向数组基础的指针,你可以像在第二个代码中那样递增,你有指针以函数的传递参数的形式。

© www.soinside.com 2019 - 2024. All rights reserved.