4

重複の可能性:
配列と配列ポインターをCの関数に渡すことの違い

私はしばらくこれを疑問に思っていましたが、これら2つの間に違いはありますか?

void f1(char *c);
void f2(char c[]);

一般的な例は次のとおりです。

int main(int argc, char **argv);
int main(int argc, char *argv[]);

芸術的なもの以外に、一方を他方よりも好む理由はありますか?

4

4 に答える 4

6

違いはありません。

馬の口から:

(C99、6.7.5.3p7)「「型の配列」としてのパラメーターの宣言は、「型への修飾ポインター」に調整されるものとします。ここで、型修飾子(存在する場合)は、配列の[および]内で指定されたものです。タイプの派生。」

ある形式を他の形式よりも好む理由は、人々によって異なります。H&Sのコメントは次のとおりです(からへの切り替えT *arrayT arr[]):

(H&S、5.4.3配列境界)「これは、実装をより正確に反映しますが、意図を明確に示すものではありません。」

于 2012-04-20T14:21:18.473 に答える
2

いいえ。関数の宣言/定義では、引数としての配列の使用は構文糖衣のみです。それはまだポインタとして渡され、それでも。ではなくsizeof(theArgument)あなたに与えます。sizeof(TheType *)sizeof(TheType) * sizeof(numElements)

于 2012-04-20T14:19:58.343 に答える
1

1つ目はこれがポインタであることを示し、2つ目はこれが配列であることを示しています。効果的な違いはありませんが、コードを読むときは、通常、最初のケースでは単一の要素、2番目のケースでは複数の要素のシーケンスを期待します。これは時々役立つかもしれません。

于 2012-04-20T14:19:51.013 に答える
0

違いはありません。CとC++の両方のすべてのn次元配列は、n次元配列と(n-1)次元配列へのポインターの両方として解釈できます(ポインターの[]セマンティクスは配列のセマンティックと同じであるため)。

于 2012-04-20T14:20:40.897 に答える