関数に配列を渡す

6124 ワード

本文
配列タイプと要素の数を配列処理関数に伝えるには、次の2つの異なるパラメータを使用します.
void fillArray(int arr[], int size);    //  

角カッコ表現を使用して配列の長さを伝達しようとしないでください.
void fillArray(int arr[size]);  //   

説明する
ほとんどの場合、C++はC言語と同様に配列名をポインタと見なします.C++配列名を最初の要素のアドレスとして解釈します.
cookies == &cookies[0]

このルールにはいくつかの例外があります.
  • 配列宣言配列名を使用して格納位置
  • をマークする.
  • 配列名にsizeofを使用すると、配列全体の長さ(バイト単位)
  • が得られる.
  • アドレス演算子&配列名に使用すると、例えば&cookiesは32バイトのメモリブロックのアドレス(intが4バイト長い場合)
  • を返す配列全体のアドレスが返されます.
    次の例を見てみましょう
    int sum=sum_arr(cookies, ArSize);

    ここで、cookiesは配列名であり、C++ルールに従ってcookiesはその最初の要素のアドレスであるため、関数はアドレスを伝達する.配列の要素のタイプはintであるため、cookiesのタイプはintポインタ、すなわちint*である必要があります.これは、正しい関数ヘッダが次のようになるべきであることを示しています.
    int sum_arr(int *arr, int n);

    このうちint *arrint arr[]に置き換えた.これは、C++において、int*arrおよびint arr[]の意味が、関数ヘッダまたは関数プロトタイプに使用される場合にのみ同じであるため、両方の関数ヘッダが正しいことを証明する.これらはarrがintポインタであることを意味します.しかしながら、配列表現(int arr[])は、arrがintだけでなく、int配列の最初のintも指すことをユーザに警告する.

    これは、配列の内容を関数に渡すのではなく、配列の位置(アドレス)、含まれる要素の種類(タイプ)、および要素の数を関数にコミットするプログラムです.これらの情報があれば、関数は元の配列を使用できます.
    通常の変数を渡すと、関数はその変数のコピーを使用します.ただし、配列を渡すと、関数は元の配列を使用します.実際、この違いはC++値で伝達する方法に違反していません.sum_arr()関数は、新しい変数に割り当てられた値を伝達しますが、この値は配列の内容ではなくアドレスです.
  • sizeof cookiesは配列全体の長さ
  • である.
  • sizeof arrはポインタ変数の長さ
  • にすぎない
    #include 
    const int ArSize=8;
    int sum_arr(int arr[], int n);
    
    int main()
    {
        int cookies[ArSize] = {1,2,4,8,16,32,64,128};
        std::cout<" =  array address, ";
        std::cout< cookies<<" = sizeof cookies
    "
    ; int sum = sum_arr(cookies, ArSize); std::cout<<"total cookies eaten: "<::endl; sum = sum_arr(cookies, 3); std::cout<<"first three eaters ate "<" cookies.
    "
    ; sum = sum_arr(cookies+4, 4); std::cout<<"last four eaters ate "<" cookies.
    "
    ; std::cout<<"

    reference:
    "
    ; int *a; int b; std::cout<<"int *a; sizeof a="< a<<"
    "
    ; std::cout<<"int b; sizeof b="< b<<"
    "
    ; return 0; } int sum_arr(int arr[], int n) { int total = 0; std::cout<" = arr, "
    ; std::cout< arr<<" = sizeof arr
    "
    ; for(int i=0;ireturn
    total; }

    出力結果
    0x7ffcb809e290 =  array address, 32 = sizeof cookies
    0x7ffcb809e290 = arr, 8 = sizeof arr
    total cookies eaten: 255
    0x7ffcb809e290 = arr, 8 = sizeof arr
    first three eaters ate 7 cookies.
    0x7ffcb809e2a0 = arr, 8 = sizeof arr
    last four eaters ate 240 cookies.
    
    
    reference:
    int *a; sizeof a=8
    int  b; sizeof b=4

    リファレンス
  • C++Primer Plus,6 th,中国語版,P 213