📜  什么是C++中的阵列衰减?如何预防?

📅  最后修改于: 2021-05-25 21:56:52             🧑  作者: Mango

什么是阵列衰减?
数组类型和维数的损失称为数组的衰减,通常在我们通过值或指针将数组传递给函数时发生。它的作用是,将第一个地址发送到作为指针的数组,因此数组的大小不是原始的,而是指针在内存中占用的大小。

// 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等的更多准备工作,请参阅“完整面试准备课程”