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++には、渡される配列のサイズを知るネイティブな方法がありません(最新の仕様で変更された可能性があると思いますが)

4

3 に答える 3

12

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]
于 2012-04-29T04:57:58.167 に答える
5

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

したがって、次の 3 つの関数宣言は同等です。

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*)ます。

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
于 2012-04-29T05:27:08.843 に答える