2012-04-29 3 views
10

これは聞いて本当に愚かなことのように感じているが、私はプログラミングのクラスが割り当て上のいくつかの助けのために私に尋ねる取って誰かを持っていたし、私は彼らのコード(ハンガリー語の表記上のコメントしてくださいなし)でこれを参照してください。関数宣言では、固定サイズの配列を渡すのはどういう意味ですか?

void read_dictionary(string ar_dictionary[25], int & dictionary_size) {... 

主にC#プログラマー(私は大学でCとC++について学んだ)として、私はあなたができることを知りませんでした。私はいつも言われた、そのあなたが

void read_dictionary(string ar_dictionary[], int ar_dictionary_size, int & dictionary_size) {... 

私は教授がそれらにこれを与えたと言われていますを持っていることになっているので、読んでいると、それが動作することを、そのような固定サイズの配列を宣言しても、何を意味しています? C++には、それが渡される配列のサイズを知る固有の方法はありません(最新の仕様で変更された可能性があるとは思うが)。

+0

これは、配列のサイズを知るためにネイティブな方法があります: この方法。あなたが配列がどれだけ素晴らしいと言えば、それはそれが信じられるでしょう。 –

+1

パラメータ宣言の '25'はコンパイラによって無視されます。 'string ar_dictionary []'と同じです。 –

+0

@ H2CO3関数がその数値で行うことは何もできません。また、コンパイラが渡されているものがそのサイズであるかどうかをチェックする方法もありません。 – cost

答えて

10

1次元配列では意味がなく、コンパイラ。 2次元以上の配列では、便利であり、行列(または多次元配列)の行の長さを決定する方法として関数によって使用されます。例えば:

int 2dArr(int arr[][10]){ 
    return arr[1][2]; 
} 

この関数は、指定された長さに応じarr[1][2]のアドレスを知っているであろう、また、コンパイラは、この機能のために配列の異なるサイズを受け入れるべきではない -

int arr[30][30]; 
2dArr(arr); 

が許可されていないとコンパイラエラー(G ++)のようになります。

error: cannot convert int (*)[30] to int (*)[10] 
+0

あなたは関数がアドレスを知っているとはどういう意味ですか? – cost

+1

[x] [y]で配列にアクセスすると、行yと列xの要素にアクセスすることを意味します。このためには行の長さを知る必要があります。 'arr [1] [2]'は 'arr [2 * 10 + 1]'と同じです。 – WeaselFox

5

パラメータ宣言で25は、コンパイラによって無視されます。 string ar_dictionary[]と書いたのと同じです。これは、配列型のパラメータ宣言が要素の型へのポインタに暗黙的に調整されているためです。

だから、次の三つの関数の宣言は等価です:

void read_dictionary(string ar_dictionary[25], int& dictionary_size) 
void read_dictionary(string ar_dictionary[], int& dictionary_size) 
void read_dictionary(string *ar_dictionary, int& dictionary_size) 

でも最初の関数の場合には、明示的に宣言された配列の大きさで、sizeof(ar_dictionary)sizeof(void*)と同じ値を返します。

this sample on Codepadを見る

#include <string> 
#include <iostream> 

using namespace std; 

void read_dictionary(string ar_dictionary[25], int& dictionary_size) 
{ 
    cout << sizeof(ar_dictionary) << endl; 
    cout << sizeof(void*) << endl; 
} 

int main() 
{ 
    string test[25]; 
    int dictionary_size = 25; 
    read_dictionary(test, dictionary_size); 

    return 0; 
} 

が出力される(正確な値は、当然ながら、実装依存であるが、これは例示目的のために純粋である):

4 
4 
+1

WeaselFoxの答えはあなたには意味がありますか?それがちょうどポインタに崩壊した場合、彼が言ったことは真実であってはならない。私はちょっと混乱しています – cost

+0

最初のものでは、sizeof(ar_dictionary)もsizeof(void *)を返しますか? – Spidey

+1

複数の次元を持つ配列は、単一の次元を持つ配列とは異なる働きをします。私はそれが何に関係しているのかは分かりません。質問は一次元配列にしか関係しません。 @cos –

1

私はいつも、その通過固定サイズもC++の配列は、C++の「半分焼いた」機能でした。例えば、サイズのマッチングや、ごく最近になって、私はこのイディオムを学ぶまでは...など、最初のインデックスのサイズを指定することができることを無視:

template<size_t N1, size_t N2> // enable_if magic can be added as well 
function(double(&m)[N1][N2]){ 
    ... do something with array m...knowing its size! 
} 

はリファレンス:Can someone explain this template code that gives me the size of an array?

関連する問題