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 test( 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); //oktest(b); //ok......
這樣解決了陣列長度可變的問題,但也引入了新的問題:
(1)當有多個不同的test呼叫時,會產生多份test**。而傳統的函式呼叫只有乙份代,也呼叫的次數無關。
(2)由於這些**都是在編譯階段生成的,它需要知道引用陣列的大小。所以這樣寫的函式顯然不能用指標變數作為函式的引數,因此不能用這個函式處理動態分配的記憶體區域,這樣的區域的大小是在執行時確定的。
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 中所謂陣列引用,即指向陣列的引用 如 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 的對陣列排序
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...