5

次の2つの機能は本質的に同じ機能ですか?

つまり、 ?int*とまったく同じint[]ですか?

int myFunction(int* xVals, int* yVals, int nVertices);
int myFunction(int xVals[], int yVals[], int nVertices);

1番目の関数はどのように使用できますか?つまり、パラメータで配列を渡すにはどうすればよいですか?次は有効/正しいですか?

int xVals[5], yVals[5], zVals[5];
myFunction(xVals, yVals, zVals, 5);

// or should it be..
myFunction(&xVals[0], &yVals[0], &zVals[0], 5);
4

4 に答える 4

8

関数パラメーターリストでは、関数宣言は同等です。

int myFunction(int* xVals, int* yVals, int nVertices);
int myFunction(int xVals[], int yVals[], int nVertices);

ただし、これは簡単には一般化されません。関数内では、次の間に大きな違いがあります。

int AnotherFunction(void)
{
    int array[] = { 0, 1, 2, 3 };
    int *iptr = &array[0];
    ...
}

また、関数インターフェースでは、2つのパラメータータイプに大きな違いがあります。

int arrays_vs_pointers(int **iptrptr, int array[][12]);

あなたはまた(修正された)について尋ねます:

int xVals[5], yVals[5];
myFunction(xVals, yVals, 5);

// or should it be..
myFunction(&xVals[0], &yVals[0], 5);

これらの呼び出しは両方とも有効であり、互いに同等です。


あなたの元の見出しの質問への答え'int *まったく同じint []ですか?'はいいえです。

それらが同等である状況は非常に限られていますが、それらが非常に異なる状況は他にもたくさんあります。

改訂された見出しの質問への回答'パラメータint *パラメータとまったく同じint []ですか?'ははいです!

于 2012-09-24T04:21:19.413 に答える
2

タイトルの質問は、実際の投稿本文の質問とは異なります...

一般に、ポインタが配列と同じであるとは限らないため、多くの場合、はとint []同じではありませんint *

ただし、関数宣言(または定義)では、1次元配列が引数として渡されると、ポインターに減衰します。そのため、最初のケースとは対照的に、

int myFunction(int *xVals, int *yVals, int nVertices);

int myFunction(int xVals[], int yVals[], int nVertices);

同等です。

于 2012-09-24T04:20:00.773 に答える
1

前の答えは正しいです。これは、宣言と呼び出しの間に不一致のパラメーター数があることを追加するだけです。

int myFunction(int* xVals, int* yVals, int nVertices);

myFunction(xVals, yVals, zVals, 5);

myFunctionは3つのパラメーターを期待していますが、呼び出しで4を渡しています。

于 2012-09-24T04:23:31.080 に答える
0

このようなパラメーター仕様に関するいくつかの興味深い (役立つ?) ポイント:

  • 1 次元配列パラメーターの次元を指定した場合、呼び出し元が提供する引数に対してチェックされることはありません。たとえば、次のようf(int x[5])になります。int x[] = { 1, 2}; f(x);int x; f(&x);

  • パラメーターへの参照を受け入れる場合、次元チェックされ、一致する必要があります。たとえばf(int (&x)[5])、正確に 5 つの要素を持つ整数配列 (またはその型にキャストされたもの) である引数でのみ呼び出すことができます。

  • テンプレートを使用して、次のように、コンパイラが既知のパラメーターの次元をキャプチャできます。template <size_t N> void f(int (&x)[N]) { ...can use N in here... }

  • これらの最後の 2 つの参照渡しパラメータについては、古いポインタへのポインタを渡すことはできませんint... ポインタが本当に適切な配列へのものである場合は、まずそれを型キャストする必要があります

  • コンパイル時に参照パラメータがチェックされるということは、コンパイル時に引数の数がわかっている場合に優先する必要があることを示唆しています...実際には、それよりも少し複雑になる可能性があります。たとえば、ヘッダー宣言を提供するライブラリvoid f(int[]);実装を変更し、異なるサイズの配列の処理をサポートする新しいライブラリ オブジェクトを出荷することができます (他の引数またはセンチネルの慣習に基づいて検出する必要があります)。ヘッダーの変更によってクライアントの再コンパイルが必要またはトリガーされることはありません (ほとんどのビルド システムで)。

于 2012-09-24T04:53:51.677 に答える