数组和指针

时间:2019-04-23 05:16:44

标签: c++ pointers

我想知道#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;
}

3 个答案:

答案 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中。它会工作。这是因为您首先需要创建一个指向数组底部的指针,然后可以像第二个代码中那样将其递增,并且该指针具有传递给该函数的参数形式。