char []
は「char の境界が不明な配列」char *
型を示し、「char へのポインタ」型を示します。ご覧のとおり、「char の境界が不明な配列の配列」型の変数の定義が文字列リテラルで初期化されると、型は「char の配列 [N]」に変換されます。ここで、N は適切なサイズです。一般に、配列集約からの初期化にも同じことが当てはまります。
int arr[] = { 0, 1, 2 };
arr は「array[3] of int」型に変換されます。
ユーザー定義型定義 ( struct
、class
またはunion
) では、C++ ではバインドされていない型の配列は禁止されていますが、C の一部のバージョンでは、割り当てられたアクセスに使用できる構造体の最後のメンバーとして許可されています。構造体の終わりを過ぎたメモリ。この使用法は「柔軟な配列」と呼ばれます。
もう 1 つの違いは、再帰型の構築です。char *
(例えばchar **
, )へのポインタと配列を構築することはできますがchar (*)[10]
、境界が不明な配列に対しては不正です。char []*
orを書くことはできませんchar [][10]
(ただしchar (*)[]
andchar [10][]
は問題ありません)。
最後に、cv 修飾の動作は異なります。typedef char *ptr_to_char
およびが与えられtypedef char array_of_unknown_bound_of_char[]
た場合、ポインター バージョンを cv 修飾すると期待どおりに動作しますが、配列バージョンを cv 修飾すると cv 修飾が要素型に移行されます。つまり、架空の とconst array_of_unknown_bound_of_char
同等であり、ではありません。これは、プロトタイプを構築する前に、配列からポインタへの減衰が引数に対して作用する関数定義では、const char []
char (const) []
void foo (int const a[]) {
a = 0;
}
合法です。array-of-unknown-bound パラメーターを変更不可にする方法はありません。