c++ - 数组作为函数中的地址常量

标签 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;
}

最佳答案

My understanding is that arrays are really just pointers

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

数组可以通过引用传递,但这通常不是这样做的。通常所做的,也就是你正在做的,是传递一个指向数组第一个元素的指针。数组可以并且将会根据需要“衰减”到指向其第一个元素的指针。这就是当您将 rates 传递给 show1show2 时发生的情况。

show1show2 中,list 开始时是指向 rates[0] 的指针。您可以随意修改此指针以指向任何其他 double

如果你想通过引用传递一个数组,它看起来像这样:

void show3(double (&list)[9]) { ... }

或者更通用的:

template<size_t SIZE>
void show3(double (&list)[SIZE]) { ... }

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

void show4(double list[9]) { ... }

其实就是一个指针,那个数字9是没有意义的。 native 数组很糟糕。

关于c++ - 数组作为函数中的地址常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19946124/

相关文章:

c++ - 在运行时如何确定非多态类型的实际类型

c++ - string.find 函数返回奇数

c++ - 多重继承引起的C++拷贝构造函数调用不明确

c# - 使用 LinQ 合并两个数组

c++ - 另一个变量作为数组的大小

c - 两种结构如何以这种方式工作

c - 从外部函数中释放指针

c++ - 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

javascript - 如何在 JavaScript 中实现函数数组?

c++ - 将指针从 C 传递到程序集