重複の可能性:
配列と配列ポインターをCの関数に渡すことの違い
私はしばらくこれを疑問に思っていましたが、これら2つの間に違いはありますか?
void f1(char *c);
void f2(char c[]);
一般的な例は次のとおりです。
int main(int argc, char **argv);
int main(int argc, char *argv[]);
芸術的なもの以外に、一方を他方よりも好む理由はありますか?
重複の可能性:
配列と配列ポインターをCの関数に渡すことの違い
私はしばらくこれを疑問に思っていましたが、これら2つの間に違いはありますか?
void f1(char *c);
void f2(char c[]);
一般的な例は次のとおりです。
int main(int argc, char **argv);
int main(int argc, char *argv[]);
芸術的なもの以外に、一方を他方よりも好む理由はありますか?
違いはありません。
馬の口から:
(C99、6.7.5.3p7)「「型の配列」としてのパラメーターの宣言は、「型への修飾ポインター」に調整されるものとします。ここで、型修飾子(存在する場合)は、配列の[および]内で指定されたものです。タイプの派生。」
ある形式を他の形式よりも好む理由は、人々によって異なります。H&Sのコメントは次のとおりです(からへの切り替えT *array
時T arr[]
):
(H&S、5.4.3配列境界)「これは、実装をより正確に反映しますが、意図を明確に示すものではありません。」
いいえ。関数の宣言/定義では、引数としての配列の使用は構文糖衣のみです。それはまだポインタとして渡され、それでも。ではなくsizeof(theArgument)
あなたに与えます。sizeof(TheType *)
sizeof(TheType) * sizeof(numElements)
1つ目はこれがポインタであることを示し、2つ目はこれが配列であることを示しています。効果的な違いはありませんが、コードを読むときは、通常、最初のケースでは単一の要素、2番目のケースでは複数の要素のシーケンスを期待します。これは時々役立つかもしれません。
違いはありません。CとC++の両方のすべてのn次元配列は、n次元配列と(n-1)次元配列へのポインターの両方として解釈できます(ポインターの[]
セマンティクスは配列のセマンティックと同じであるため)。