C 對陣列的引用例項分析

2022-10-04 04:15:10 字數 1801 閱讀 7756

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...