程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++對數組的援用實例剖析

C++對數組的援用實例剖析

編輯:關於C++

C++對數組的援用實例剖析。本站提示廣大學習愛好者:(C++對數組的援用實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是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*的援用,按理應當是准確的啊,為何會報錯呢?這是由於編譯器對指向數組的援用檢討加倍嚴厲,須要檢討數組的維數,在這裡a被懂得成指向10個int數組的指針int [10],關於援用也須要響應的援用類型int (&)[10],即指向10個int數組的指針的援用。

c和c++中有一個“數組降價”成績。以下所示:

#include <iostream>
void test( char arr[100] )
{
   std::cout << sizeof(arr) << std::endl ; // 輸入 4
}
int main()
{
  char arr[100] = { 0 };
  std::cout << sizeof(arr) << std::endl; // 輸入 100 
  test( arr );

  return 0 ;
}

這段代碼的輸入是:
100
4

關於異樣的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] )
{
   std::cout << sizeof(arr) << std::endl;
}

被降成

void test( char* const arr )
{
   std::cout << sizeof(arr) << std::endl; // 既然是char*,固然輸入4
}

如許,即然不檢討數組的年夜小,關於須要包管數組年夜小的法式就會帶來成績。若何處理這個成績呢?可以用c++中的對數組的援用。

看上面這段代碼:

......
void test( const char (&arr)[100] )
{
   std::cout << sizeof(arr) << std::endl ; // 輸入 100
}
......
  char arr[100] = { 0 };
  std::cout << sizeof(arr) << std::endl; // 輸入 100 
  test( arr );
......

如許test就可以接收100個char的數組,且只能接收年夜小為100的char數組。

假如:

char arr[20] = {0};
test( arr ) ;

就會報錯

在C++中,對數組的援用可以直接傳遞數組名,由於數組的年夜小的信息已在形參裡供給了。然則如許一來我們只能固定命組的年夜小來用這個函數了。用模板加數組的援用可以處理這個成績,看以下代碼:

template <int sz>
void test(char (&arr)[sz])
{
  for ( int i = 0; i < sz; i++ )
......}
char a[2] = { 0 }, b[15] = { 0 };
test(a);  //ok
test(b);  //ok......

如許處理了數組長度可變的成績,但也引入了新的成績:

(1)當有多個分歧的test挪用時,會發生多份test代碼。而傳統的函數挪用只要一份代,也挪用的次數有關。
(2)因為這些代碼都是在編譯階段生成的,它須要曉得援用數組的年夜小。所以如許寫的函數明顯不克不及用指針變量作為函數的參數,是以不克不及用這個函數處置靜態分派的內存區域,如許的區域的年夜小是在運轉時肯定的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved