今天写代码遇到了一个问题,随手记录。
当函数形参为一维数组时,传入的数组会退化为指向该数组首地址的指针。
实际上,对数组名进行取地址&和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