2013-01-13 3 views
41
#include <iostream> 
using namespace std; 

void printarray (int arg[], int length) { 
    for (int n = 0; n < length; n++) { 
     cout << arg[n] << " "; 
     cout << "\n"; 
    } 
} 

int main() 
{ 
    int firstarray[] = {5, 10, 15}; 
    int secondarray[] = {2, 4, 6, 8, 10}; 
    printarray(firstarray, 3); 
    printarray(secondarray, 5); 

    return 0; 
} 

このコードは機能しますが、どのように配列が渡されているか理解したいと思います。C++で機能する配列を渡す

main関数からprintarray関数が呼び出されると、配列の名前が渡されます。配列の名前は、配列の最初の要素のアドレスを参照します。これはどのようにint arg[]と同じですか?

+0

具体的には、配列の名前は配列を参照します。ほとんどの場合、最初の要素へのポインタに変換できます。 –

答えて

20

構文

int[] 

int[X] // Where X is a compile-time positive integer 

はまさに関数パラメータリストで(私は、オプションの名前を残し)

int* 

と同じです。

また、配列名が関数に渡される(参照によって渡されない)最初の要素へのポインタを減衰するので、両方int firstarray[3]int* Sにint secondarray[5]減衰。

配列逆参照と添字構文(添字構文がx[y])によるポインタ逆参照の両方が、同じインデックスを使用するときに同じ要素に左辺値を返すことも起こります。

これらの3つのルールは、コードを合法化して期待通りに動作させるために組み合わせられています。配列へのポインタが関数に渡されるだけでなく、配列の長さが渡された後に知ることができません。

+8

絶対に間違っています。 'int []'と 'int [X]'は配列型であり、そのままの状態です。ポインタ・ディケイに対する配列は、配列型の変数の最初の要素のポインタへの暗黙的な変換です(期待される場合)。この関数の宣言は、関数のパラメータの型が最初の要素へのポインタに調整されたものであり、ポインタの減衰の配列ではありません。なぜ誰もあなたにそれを話したことはありません。 – AnArrayOfFunctions

+0

あなた自身を教育し、[this](https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/hwQWZ_uvXDI) – AnArrayOfFunctions

+0

を読んでください。この回答の前半は間違っています。 'int [X]'パラメータは 'int *'と同じではありません。 – Navin

7

firstarrayおよびsecondarrayは、printarray()に渡されたときにintへのポインタに変換されます。

printarray(int arg[], ...)はしかし、これはC++に固有ではありませんprintarray(int *arg, ...)

に相当します。 Cには配列名を関数に渡すのと同じ規則があります。あなたは

arg[n]

のように、配列の位置にアクセスしたとき、私はちょうどたい、これを追加

10

はデargのアドレスから始まるn個のオフセットを意味よりも

*(arg + n) と同じです。

のでarg[]*arg

0

になります質問が既に回答されていますが、私はより正確な用語やC++標準を参照して答えを追加しようと思いました。

二つの物事がここで起こっている、配列パラメータは、ポインタパラメータに調整されている、と配列引数は、引数をポインタに変換されています。これらは2つの全く異なるメカニズムです。最初はパラメータの実際の型への調整ですが、もう1つは最初の要素への一時的なポインタを導入する標準的な変換です。あなたの関数宣言に

調整:

dcl.fct#5

各パラメータのタイプ、(...)「Tの配列」タイプの任意のパラメータを決定した後に調整されます"Tへのポインタ"。

したがってint arg[]は、int* argに調整されます。あなたの関数の引数の

変換:

conv.array#1

種類の左辺値または右辺値「NTの配列」または「Tの上限不明のアレイ」のprvalueに変換することができます「Tへのポインタ」とタイプします。一時的なマテリアライゼーション変換が適用されます。結果は、配列の最初の要素へのポインタです。

printarray(firstarray, 3);

だからで、型の左辺値firstarray「3 intの配列を」第1の要素を指し、prvalue(一時的な)タイプの「intへのポインタ」に変換されます。

関連する問題