c++中所謂陣列引用,即指向陣列的引用;
如:int a[10] ;
int (&b)[10] = a ;
如果寫成:
int a[10] ;
int* &b = a ;
系統將會報錯: cannot convert from 'int [10]' to 'int *&'。
或許你會說在陣列名不就是指向這個陣列的乙個指標嗎?題中a是int*型別的,b是指向int*的引用,按理應該是正確的啊,為什麼會報錯呢?這是因為編譯器對指向陣列的引用檢查更加嚴格,需要檢查陣列的維數,在這裡a被理解成指向10個int陣列的指標int [10],對於引用也需要相應的引用型別int (&)[10],即指向10個int陣列的指標的引用。
c和c++中有乙個「陣列降價」問題。如下所示:
#include
void test( char arr[100] )
int main()
; std::cout << sizeof(arr) << std::endl; // 輸出 100
test( arr );
return 0 ;
}這段**的輸出是:
1004
對於同樣的arr,乙個輸出100,另乙個輸出4。是因為void test( char arr[100] )中的arr被降價了。
void test( char arr[100] ) 中的arr被降階處理了,
void test( char arr[100] ) 等同於void test( char arr ), 也等同於void tes char* const arr ) 如果你原意,它甚至等同於void test( char arr[10] )
編譯器對陣列的維數不作檢查。也就是說:
void test( char arr[100] )
被降成void test( char* const arr )
這樣,即然不檢查陣列的大小,對於需要保證陣列大小的程式就會帶來問題。如何解決這個問題呢?可以用c++中的對陣列的引用。
看下面這段**:
......
void test( const char (&arr)[100] )
......
char arr[100] = ;
std::cout << sizeof(arr) << std::endl; // 輸出 100
test( arr );
......
這樣test就能接受100個char的陣列,且只能接受大小為100的char陣列。
如果:char arr[20] = ;
test( arr ) ;
就會報錯
在c++中,對陣列的引用可以直接傳遞陣列名,因為陣列的大小的資訊已在形參裡提供了。但是這樣一來我們只能固定陣列的大小來用這個函式了。用模板加陣列的引用可以解決這個問題,看如下**:
template
void test(char (&arr)[sz])
char a[2] = , b[15] = ;
test(a); //ok
test(b); //ok......
這樣解決了陣列長度可變的問題,但也引入了新的問題:
(1)當有多個不同的test呼叫時,會產生多份test**。而傳統的函式呼叫只有乙份代,也呼叫的次數無關。
(2)由於這些**都是在編譯階段生成的,它需要知道引用陣列的大小。所以這樣寫的函式顯然不能用指標變數作為函式的引數,因此不能hg**nv用這個函式處理動態分配的記憶體區域,這樣的區域的大小是在執行時確定的。
本文標題: c++對陣列的引用例項分析
本文位址:
c 對陣列的引用
所謂陣列引用,即指向陣列的引用 如 int a 10 int b 10 a 如果寫成 int a 10 int b a 將會報錯 cannot convert from int 10 to int 或許你會說在陣列名不就是指向這個陣列的乙個指標嗎?題中a是int 型別的,b是指向int 的引用,按理...
c 對陣列的引用
c和c 中有乙個 陣列降價 問題。include void test char arr 100 int main std cout sizeof arr std endl 輸出 100 test arr return 0 這段 的輸出是1004 對於同樣的arr,乙個輸出100,另乙個輸出4。是因為...
C 的對陣列排序
int list int list new int 10 for int i 0 i 10 i console.writeline 排序前 for int i 0 i list.length i console.writeline list i console.writeline int tmp 0...