数组与指针的关系

数组名可以看作是指向数组中第一个元素的指针。

在向函数传递数组时,可以通过指针传递,也可以通过引用传递。

代码如下:

#include <iostream>

int main() {
    {
        // 数组退化(Decay)为指针

        int myIntArray[10] {};
        int* myIntPtr {myIntArray};

        // 通过指针访问数组元素
        myIntPtr[4] = 5;
    }

    {
        // 使用指针将数组传递给函数

        /*
        如下三种参数的声明等价:
        int* theArray
        int theArray[]
        int theArray[2]  // 方括号内的数字会被忽略
        */
        auto doubleInts {[](int* theArray, std::size_t size){
            for (std::size_t i{}; i < size; ++i) {
                theArray[i] *= 2;
            }
        }};

        // 传递自由存储区中的数组
        std::size_t arrSize{4};
        int* freeStoreArray {new int[arrSize]{1,5,3,4}};
        doubleInts(freeStoreArray, arrSize);
        delete [] freeStoreArray;
        freeStoreArray = nullptr;

        // 传递栈上的数组
        int stackArray[] {1,5,3,4};
        std::size_t arrSize2 {std::size(stackArray)};  // Since C++17
        // std::size_t arrSize2 {sizeof(stackArray) / sizeof(stackArray[0])};  // Pre-C++17
        doubleInts(stackArray, arrSize2);
        // 等价于:
        doubleInts(&stackArray[0], arrSize2);
    }

    {
        // 使用引用将数组传递给函数

        // 该函数只接收大小为 4 的基于栈的数组
        auto doubleInts {[](int (&theArray)[4]){
            for (std::size_t i{}; i < std::size(theArray); ++i) {
                theArray[i] *= 2;
            }
        }};

        int stackArray[] {1,5,3,4};
        doubleInts(stackArray);

        // int stackArray2[] {1,5,3};
        // doubleInts(stackArray2);  // 将报错,因为数组不符合要求
    }

    {
        // 使用引用将数组传递给函数

        // 函数模板,让编译器自动推断栈上数组的大小
        auto doubleInts {[]<std::size_t N>(int (&theArray)[N]){
            for (std::size_t i{}; i < N; ++i) {
                theArray[i] *= 2;
            }
        }};
        // 等价于常规写法:
        //template<std::size_t N>
        //void doubleInts(int (&theArray)[N]) {
        //    for (std::size_t i{}; i < N; ++i) { theArray[i] *= 2; }
        //}

        int stackArray[] {1,5,3,4};
        doubleInts(stackArray);

        int stackArray2[] {1,5,3};
        doubleInts(stackArray2);

        for (auto item : stackArray) {std::cout << item << " ";}
        std::cout << std::endl;

        for (auto item : stackArray2) {std::cout << item << " ";}
        std::cout << std::endl;
    }

    return 0;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注