回答:
配列を値によって関数に渡すか、関数から値によって配列を返すことができます。
これらのコンテキストでポインタに減衰する配列とは異なり、構造体は値で渡すことができます。
もう1つの利点は、サイズが抽象化されるため、[MAX]
そのようなオブジェクトを宣言するときはどこでもコード全体を使用する必要がないことです。これは、
typedef char ABC[MAX];
しかし、あなたははるかに大きな問題を抱えています:あなたはそれABC
が配列型であることを認識しなければなりません(タイプの変数を宣言するときにこれを見ることができないとしてもABC
)さもなければ、ABC
何か違うことを意味するという事実に悩まされるでしょう関数の引数リストと変数の宣言/定義の比較。
もう1つの利点は、構造体を使用すると、多くのコードを書き直さなくても、後で必要に応じて要素を追加できることです。
このようにコピーできます。
struct ABC a, b;
........
a = b;
配列の場合は、memcpy関数またはループを使用して各要素を割り当てる必要があります。
structを使用して、stringのような新しいタイプのデータを作成できます。あなたが定義することができます:
struct String {
char Char[MAX];
};
または、関数の引数で使用したり、メソッドで返すことができるデータのリストを作成できます。=のようないくつかの演算子をサポートでき、その中にいくつかのメソッドを定義できるため、構造体は配列よりも柔軟性があります。
それがあなたに役立つことを願っています:)
そのようなaを使用するもう1つの利点struct
は、そのようなa が使用される場合は常に型保証struct
が適用されることです。特に、異なる目的で使用される同じサイズの配列で構成される2つの型がある場合、これらの型は、誤って配列を不適切に使用することを防ぐのに役立ちます。
配列をでラップしない場合struct
でも、そのtypedef
ためにを宣言できます。これには、次のような利点がありstruct
ます。–•型が1回宣言される•サイズが自動的に正しい•コードの意図がより明確になる•コードはより保守しやすくなります–しかし、厳密な型安全性、◦型の値をコピーして返す機能、および残りのコードを壊さずに後でメンバーを追加する機能が失われます。typedef
特定のタイプのベア配列の2 つのは、サイズが異なる場合にのみ異なるタイプを生成します。あなたが使用している場合また、typedef
せずに*
関数の引数で、それは同等ですchar *
劇的型の安全性を減らすこと、。
要約すると:
typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char A_c_t[113]; // Partial type-safety, not assignable
A_s_t v_s(void); // Allowed
A_c_t v_c(void); // Forbidden
void s__v(A_s_t); // Type-safe, pass by value
void sP_v(A_s_t *); // Type-safe
void c__v(A_c_t); // UNSAFE, just means char * (GRRR!)
void cP_v(A_c_t *); // SEMI-safe, accepts any array of 113
構造体には、OOPメモリ管理パラダイムのいくつかの利点をエミュレートする配列の初期化、コピー、およびfini関数を含めることができます。実際、この概念を拡張して汎用のメモリ管理ユーティリティを作成し(sizeof()構造体を使用して管理されているバイト数を正確に把握することにより)、ユーザー定義の構造体を管理することは非常に簡単です。Cで記述されたスマートプロダクションコードベースの多くはこれらを頻繁に使用し、そのスコープが非常にローカルでない限り、通常は配列を使用しません。
実際、構造に埋め込まれた配列の場合、この配列にアクセスしたいときはいつでも、境界チェックなどの他の「スマートなこと」を実行できます。繰り返しになりますが、配列のスコープが非常に限られている場合を除き、配列のスコープを使用してプログラム間で情報を渡すことはお勧めできません。遅かれ早かれ、夜に目を覚まし、週末を台無しにするバグに遭遇します。
struct
を含むを使用するのかという質問には答えません。