2012-04-20 9 views
4

可能性の重複:
Difference between passing array and array pointer into function in Cこれら2つの宣言に違いはありますか?

私はしばらくの間、これを不思議に思ってきたが、これらの二つの間に違いはありますか?

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

一般的な例はこれです:

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

芸術的なものから離れて、他の1つを、好むために任意の理由はありますか?

+1

http://stackoverflow.com/questions/5573310/difference-between-passing-array-and-array-pointer-into-function-in-c – chepner

答えて

6

違いはありません。馬の口から

(C99、6.7.5.3p7)タイプ修飾子タイプのアレイは、 『入力する修飾ポインタ『に調整されなければならない』「などのパラメータの宣言』 (もしあれば)は、配列型導出の[および]内で指定されたものです。

1つのフォームを他のフォームよりも優先させる理由は、人によって異なります。ここでH & Sは(T arr[]からT *arrayへの切り替えに)言うことです:

(H & S、5.4.3配列範囲)は、「それは、より正確な実装を反映するが、あまり明確に意思を示すことになります。」

+0

H&Sとは誰ですか?このような短いクエリでは、Googleはあまり役に立ちません。 – orlp

+0

Harbison&Steele http://careferencemanual.com – ouah

+0

[Harbison&Steele](http://careferencemanual.com/)。 –

1

まず、これがポインタであることを示し、2番目がこれが配列であることを示します。実効的な違いはありませんが、コードを読むと、最初のケースでは単一の要素が2番目のケースでは1つ以上の要素のシーケンスが必要です。これは時には役に立つかもしれません。

2

いいえ関数宣言/定義では、引数としての配列の使用は構文的な砂糖のみです。まだポインタとして渡されており、sizeof(theArgument)sizeof(TheType) * sizeof(numElements)ではなく、sizeof(TheType *)を返します。

0

違いはありません。 CとC++の両方のn次元配列は、n次元配列と(n-1)次元配列へのポインタの両方として解釈できます(ポインタの[]意味は配列のものと同じです)。

関連する問題