数组退化

217 阅读1分钟

今天写代码遇到了一个问题,随手记录。

当函数形参为一维数组时,传入的数组会退化为指向该数组首地址的指针。

实际上,对数组名进行取地址&和sizeof以外的所有操作,都会导致数组退化。

int arr[10] = { 2,0,0,2,0,1,2,8 };
cout << "in main, sizeof(arr) = " << sizeof(arr) << endl;
cout << "in main, sizeof(&arr) = " << sizeof(&arr) << endl;
cout << "in main, arr = " << arr << endl;
cout << "in main, &arr = " << &arr << endl;

输出如下:

in main, sizeof(arr) = 40
in main, sizeof(&arr) = 4
in main, arr = 00AFFAB8
in main, &arr = 00AFFAB8

sizeof(arr)得到了该数组所占内存的大小。之间输出arr和&arr,发现两者是同一个地址。

此时数组退化为指向数组首地址的指针,因为数组的首地址也是首元素的地址,所以也可以说退化为了指向数组首元素的指针

此时发生的现象就是(数组)退化。

把数组传入函数也会导致退化。

void size_1(int arr[])
{
    cout << "in function size_1, sizeof(arr) = " << sizeof(arr) << endl;
    cout << "in function size_1, sizeof(&arr) = " << sizeof(&arr) << endl;
    cout << "in function size_1, arr = " << arr << endl;
    cout << "in function size_1, &arr = " << &arr << endl;
}

输出如下:

in function size_1, sizeof(arr) = 4
in function size_1, sizeof(&arr) = 4
in function size_1, arr = 00AFFAB8
in function size_1, &arr = 00AFF9E4

若想传入一个数组(不退化)进入函数,可以这样做

首先该数组必须是在编译时就确定长度的(定长数组)。

传入数组的引用。

void size_2(int(&arr)[10])
{
    cout << "in function size_2, sizeof(arr) = " << sizeof(arr) << endl;
    cout << "in function size_2, sizeof(&arr) = " << sizeof(&arr) << endl;
    cout << "in function size_2, arr = " << arr << endl;
    cout << "in function size_2, &arr = " << &arr << endl;
}

输出如下:

in function size_2, sizeof(arr) = 40
in function size_2, sizeof(&arr) = 4
in function size_2, arr = 00AFFAB8
in function size_2, &arr = 00AFFAB8

完整代码及其输出如下:

#include <iostream>
using namespace std;

void size_1(int arr[])
{
    cout << "in function size_1, sizeof(arr) = " << sizeof(arr) << endl;
    cout << "in function size_1, sizeof(&arr) = " << sizeof(&arr) << endl;
    cout << "in function size_1, arr = " << arr << endl;
    cout << "in function size_1, &arr = " << &arr << endl;
}

void size_2(int(&arr)[10])
{
    cout << "in function size_2, sizeof(arr) = " << sizeof(arr) << endl;
    cout << "in function size_2, sizeof(&arr) = " << sizeof(&arr) << endl;
    cout << "in function size_2, arr = " << arr << endl;
    cout << "in function size_2, &arr = " << &arr << endl;
}

int main()
{
    int arr[10] = { 2,0,0,2,0,1,2,8 };

    cout << "in main, sizeof(arr) = " << sizeof(arr) << endl;
    cout << "in main, sizeof(&arr) = " << sizeof(&arr) << endl;
    cout << "in main, arr = " << arr << endl;
    cout << "in main, &arr = " << &arr << endl;
    cout << endl;

    size_1(arr);
    cout << endl;

    size_2(arr);
    cout << endl;

    return 0;
}

输入如下:

in main, sizeof(arr) = 40
in main, sizeof(&arr) = 4
in main, arr = 00AFFAB8
in main, &arr = 00AFFAB8

in function size_1, sizeof(arr) = 4
in function size_1, sizeof(&arr) = 4
in function size_1, arr = 00AFFAB8
in function size_1, &arr = 00AFF9E4

in function size_2, sizeof(arr) = 40
in function size_2, sizeof(&arr) = 4
in function size_2, arr = 00AFFAB8
in function size_2, &arr = 00AFFAB8