◎衰變概念
- 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);//編譯失敗 }
留言
張貼留言