c 對陣列的引用

2021-06-20 10:40:35 字數 1375 閱讀 7372

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