数组作为函数中的地址常量

use*_*227 0 c++ arrays pointers

我正在自学C++并且对数组和指针有一些疑问.我的理解是数组实际上只是指针,但是,数组是无法更改的地址常量.

如果是这种情况,我想知道为什么在我的函数中show2()我能够改变指针的地址list.与变量不同,我认为数组是通过引用传递的,所以我在调用函数时期望编译器错误,show2()因为我增加了地址list.但代码工作得很好.有人可以解释一下吗?

谢谢!

#include<iostream>
#include<iomanip>

using namespace std;

void show1(double *list, int SIZE)
{
    for(int i=0; i < SIZE; i++)
    {
        cout << setw(5) << *(list+i);
    }
    cout << endl;
    return;
}

void show2(double *list, int SIZE)
{
    double *ptr = list;

    for(int i=0; i < SIZE; i++)
        cout << setw(5) << *list++;
    cout << endl;
    return;
}

int main()
{
    double rates[] = {6.5, 7.2, 7.5,  8.3, 8.6, 
                      9.4, 9.6, 9.8, 10.0};
    const int SIZE = sizeof(rates) / sizeof(double);

    show1(rates, SIZE);
    show2(rates, SIZE);    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*ley 5

我的理解是数组实际上只是指针

让我们解决这个问题.不,数组不是指针.数组是一系列对象,都是相同的类型,在内存中是连续的.

数组可以通过引用传递,但这不是通常所做的.通常做的是你正在做的事情,就是将指针传递给数组的第一个元素.根据需要,数组可以并且将"衰减"到指向其第一个元素的指针.这就是你传递ratesshow1和的时候发生的事情show2.

内部show1show2,list开始作为一个指针rates[0].您可以自由修改此指针以指向任何其他指针double.

如果您想通过引用传递数组,它将如下所示:

void show3(double (&list)[9]) { ... }
Run Code Online (Sandbox Code Playgroud)

或者更通用:

template<size_t SIZE>
void show3(double (&list)[SIZE]) { ... }
Run Code Online (Sandbox Code Playgroud)

请注意,您不能做的是按值传递数组(除非它包含在另一个对象中).如果您编写的函数看起来像是按值获取数组,例如

void show4(double list[9]) { ... }
Run Code Online (Sandbox Code Playgroud)

它实际上是一个指针,而数字9是没有意义的.本机阵列很糟糕.