5

配列がどのようにポインターに減衰するかを理解しています。コンパイラの場合、これは次のことを理解しています:

void foo(int *arg1);

はこれと 100% 同等です:

void foo(int arg1[]);

あるスタイルを他のスタイルよりも優先する必要がありますか? 一貫性を保ちたいのですが、どちらの決定も正当化するのに苦労しています。

int main(int argc, char *argv[])とは同じですがint main(int argc, char **argv)、前者の方がはるかに一般的なようです (間違っていたら訂正してください)。

4

2 に答える 2

7

関数パラメーターの構文を使用しないことをお勧めします。[]

使用を支持する 1 つの議論は[]、自己文書化された方法で、ポインターが複数のものを指すことが期待されることを意味するということです。例えば:

void swap(int *x, int *y)
double average(int vals[], int n)

しかし、なぜではchar *なく、常に文字列に使用されるのchar []ですか? 私はむしろ一貫性を保ち、常に使用したいと思います*

一部の人々constは、値渡しパラメータを含め、できる限りのことを好みます。を使用する場合の構文[](C99 でのみ使用可能) は直感的ではなく、おそらくあまり知られていません。

const char *const *const words対。const char *const words[const]

constいずれにせよ、その決勝はやり過ぎだと思いますが。

さらに、配列が減衰する方法は完全に直感的ではありません。特に、再帰的に適用されません(char words[][]動作しません)。特に、より間接的にスローし始めると、[]構文が混乱を招くだけです。IMO は、配列が引数として渡されるふりをするよりも、常にポインター構文を使用することをお勧めします。

詳細: http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr#aryptrparam .

于 2012-08-26T04:31:54.330 に答える
3

を除いて、渡された項目が概念的に配列である (つまり、N>1 の要素を含む) 場合、渡された項目が 1 つのオブジェクトへのポインターである場合、N は数値または定義済みの定数であるchar*を使用します。Type array[N]Type * pointer

std::vector配列が可変サイズの場合に使用する傾向があります。C99 の可変サイズ配列の概念は、C++ では使用できません。

于 2012-08-26T05:45:06.093 に答える