C++ - array decay (C++軟體開發 - 陣列衰變 概念與實例)

 ◎衰變概念
  • array 衰變 為pointer,如 : int x[10]衰變為int*,並且會失去原本array應該有的訊息(整個array原本的大小),而變成指針的大小。
  • 如果傳遞的參數為array,其實傳遞的並不會是array,而是pointer,並指向array的第一個元素,此pointer會被複製到參數進行傳遞,因此失去原本array應該有的訊息(sizeof..等等)。
 ◎衰變原因
  • array可以很小,但也可以很大,當可用記憶體不夠時,傳遞array是很可怕的。 
  • 基本上array與pointer是相同類型,array只是利用給定的start address,在其sizeof的memory(byte),進行iterate。
 ◎傳遞array狀況
  • parameter 與 argument陣列大小不同不會出錯。
  • parameter為pointer不會出錯。
  • 可以利用parameter引用的方式,避免array的衰退,但因為不會因為衰退而失去大小訊息,因此parameter 與 argument大小必須相同。

 ◎簡單範例

#include <stdio.h>
#include <stdlib.h>
#include <iterator>  
#include <iostream>
#include <vector>
using namespace std;

void passingArray(int array[]) {
    cout << " Print array = " << array << endl;
    cout << " Array sizeof = " << sizeof(array) << endl;
    cout << " Array typeid = " << typeid(array).name() << endl;
}
//因為傳遞的array已經衰退為指針,即使 parameter 與 argument大小不同也不會出錯
void passingArray2(int array[10]) {
    cout << " Print array = " << array << endl;
    cout << " Array sizeof = " << sizeof(array) << endl;
    cout << " Array typeid = " << typeid(array).name() << endl;
}
//因為傳遞的array已經衰退為指針,即使parameter為pointer也不會出錯
void passingArray3(int *array) {
    cout << " Print array = " << array << endl;
    cout << " passing sizeof = " << sizeof(array) << endl;
    cout << " passing typeid = " << typeid(array).name() << endl;
}
//可以利用parameter引用的方式,避免array的衰退
void passingArray4(int (&array)[12]) {
    cout << " Print array = " << array << endl;
    cout << " passin sizeof = " << sizeof(array) << endl;
    cout << " passing typeid = " << typeid(array).name() << endl;
}
//因為parameter引用,array不會衰退,arameter 與 argument大小不同會出錯
void passingArray5(int(&array)[10]) {
    cout << " Print array = " << array << endl;
    cout << " passin sizeof = " << sizeof(array) << endl;
    cout << " passing typeid = " << typeid(array).name() << endl;
}
int main(void){
    cout << "Create array....." << endl;
    int array[12] = { 0 };
    cout <<" Print array = "<< array << endl;
    cout << " array sizeof = " << sizeof(array) << endl;
    cout << " array typeid = " << typeid(array).name() << endl ;
    //print array
    std::copy(std::begin(array),
        std::end(array),
        std::ostream_iterator<int>(std::cout, " "));
    cout << endl << endl;
    cout << " Enter passingArray By int array[]....... " << endl;
    passingArray(array);
    cout << " Leave passingArray By int array[]....... " << endl << endl;
    cout << " Enter passingArray By int array[10]...... " << endl;
    passingArray2(array);
    cout << " Leave passingArray By int array[10]....... " << endl << endl;
    cout << " Enter passingArray By int *array...... " << endl;
    passingArray3(array);
    cout << " Leave passingArray By int array[10]....... " << endl << endl;
    cout << " Enter passingArray By int (&array)[12]...... " << endl;
    passingArray4(array);
    cout << " Leave passingArray By int (&array)[12]....... " << endl << endl;

    //passingArray5(array);//編譯失敗
}

留言