陣列的引用的用途

2021-06-23 06:34:55 字數 1549 閱讀 6464

在c++中可以定義陣列的引用,用以解決c中無法解決的「陣列降價」問題,我們先來看看什麼是「陣列降價」,先看如下**: …

void test( char array[20] )

char array[20] = ;

cout << sizeof(array) << endl; // 輸出 20

test( array );

…我們看到,對於同樣的陣列array,乙個輸出4,另乙個輸出20。這是因為

void test( char array[20] ) 中的array被降階處理了,

void test( char array[20] ) 等同於 

void test( char array ) 也等同於

void test( char* const array ) 如果你原意,它甚至等同於

void test( char array[999] )

也就是說

void test( char array[20] )

被降成void test( char* const array )

這樣以來,我們在函式宣告中的陣列大小限制是無效的,宣告 void test( char array[20] ) 並不能保證一定會接收到乙個大小20的陣列,即任何 char 都會被降價為 char* ,這樣就增加了程式出錯的可能性。

要解決這樣乙個問題,我們可以用c++的陣列引用作為引數,看以下**: …

void test( char (&array)[20] )//是不是很像 char *p[20] 和 char (*p)[20] 的區別?

char array[20] = ;

cout << sizeof(array) << endl;

test( array );…

這樣 test 函式就只能接收大小為 20 的 char,看如下**: …

char array1[10] = ;

char array2[20] = ;

test(array1);//error:實參不是大小為 10 的 char

test(array2);//ok …

在 c++ 中,單純的用陣列的引用可以直接傳遞陣列名,因為它將陣列的大小已在形參裡提供了資訊。但是這樣一來我們只能固定陣列的大小來用這個函式了。用模板加陣列的引用可以解決這個問題,看如下**: …

template

void test(int (&array)[sz])

int a[2] = , b[15] = ;

test(a);//ok

test(b);//ok …

只可惜任何事情都不會太完美,使用模板後確實可以使同一函式能夠處理大小不同的陣列了,擴大了函式的適用範圍。但是這樣定義的函式仍然存在著下述缺點:

1. 模板最終是要例項化的,所以呼叫多少個不同長度的陣列,就要產生這個函式的多少份例項**。而傳統方式的函式只有乙份例項,與函式的呼叫次數無關。

2. 不能應用於在編譯期間陣列的大小尚未確定的情況,這也使這個模板函式的適用範圍受到限制。

3. 這樣寫的函式顯然不能用指標變數作為函式的引數,因此不能用這個函式處理動態分配的記憶體區域。

稀疏陣列的用途

對於二維陣列中如果有多數資料為相同的值,少數為有效值的陣列,可以通過稀疏陣列進行重新儲存,較少空間占用,後面可以通過這個稀疏陣列恢復之前的二維陣列 稀疏陣列的arrays 0 0 儲存行的數量 arrays 0 1 儲存列的數量 arrays 0 2 儲存有效值的數量 arrays 1 0 儲存第乙...

陣列名的用途

一維陣列名 include using namespace std intmain cout 整個陣列所佔記憶體空間為 sizeof arr endl cout 每個元素所佔記憶體空間為 sizeof arr 0 endl cout 陣列的元素個數為 sizeof arr sizeof arr 0 ...

lua弱引用表weak table的用途

目錄 1.簡介 2.定義 3.示例 示例1示例2 4.應用 1.記憶 快取 函式 示例1示例2 2.設定表的預設值 1 lua的gc預設是自動 的,當乙個物件的引用計數為0時,它就會被gc所 2 lua中的表預設是強引用的,當你把某個物件放入表中時,就是生成乙個對它的強引用 物件的引用計數 1 在物...