什么是阵列衰减?
数组类型和维数的损失称为数组的衰减,通常在我们通过值或指针将数组传递给函数时发生。它的作用是,将第一个地址发送到作为指针的数组,因此数组的大小不是原始的,而是指针在内存中占用的大小。
// C++ code to demonstrate array decay
#include
using namespace std;
// Driver function to show Array decay
// Passing array by value
void aDecay(int *p)
{
// Printing size of pointer
cout << "Modified size of array is by "
" passing by value: ";
cout << sizeof(p) << endl;
}
// Function to show that array decay happens
// even if we use pointer
void pDecay(int (*p)[7])
{
// Printing size of array
cout << "Modified size of array by "
"passing by pointer: ";
cout << sizeof(p) << endl;
}
int main()
{
int a[7] = {1, 2, 3, 4, 5, 6, 7,};
// Printing original size of array
cout << "Actual size of array is: ";
cout << sizeof(a) <
输出:
Actual size of array is: 28
Modified size of array by passing by value: 8
Modified size of array by passing by pointer: 8
在上面的代码中,实际的数组具有7个int元素,因此具有28个大小。但是通过按值和指针进行调用,数组会衰减为指针并输出1个指针的大小,即8(32位中为4)。
如何防止阵列衰减?
处理衰减的典型解决方案是也将数组的大小作为参数传递,而不在数组参数上使用sizeof(有关详细信息,请参见此)
防止数组衰减的另一种方法是通过引用将数组发送到函数中。这样可以防止将数组转换为指针,因此可以防止衰减。
// C++ code to demonstrate prevention of
// decay of array
#include
using namespace std;
// A function that prevents Array decay
// by passing array by reference
void fun(int (&p)[7])
{
// Printing size of array
cout << "Modified size of array by "
"passing by reference: ";
cout << sizeof(p) << endl;
}
int main()
{
int a[7] = {1, 2, 3, 4, 5, 6, 7,};
// Printing original size of array
cout << "Actual size of array is: ";
cout << sizeof(a) <
输出:
Actual size of array is: 28
Modified size of array by passing by reference: 28
在上面的代码中,按引用传递数组解决了数组衰减的问题。两种情况下的尺寸均为28。
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。