Objective-c-structures
Objective-Cの構造
Objective-C配列を使用すると、同じ種類の複数のデータ項目を保持できる変数のタイプを定義できますが、 structure は、Objective-Cプログラミングで使用できる別のユーザー定義データ型で、異なる種類のデータ項目を組み合わせることができます。
構造はレコードを表すために使用されます。図書館で本を追跡したいとします。 あなたは、各本に関する次の属性を追跡することができます-
- タイトル
- 著者
- 件名
- ブックID
構造の定義
構造を定義するには、 struct ステートメントを使用する必要があります。 structステートメントは、プログラムに複数のメンバーを持つ新しいデータ型を定義します。 構造体ステートメントの形式は以下に示されています-
- 構造タグ*はオプションであり、各メンバー定義はint iなどの通常の変数定義です。またはfloat f;または他の有効な変数定義。 構造の定義の最後で、最後のセミコロンの前に、1つ以上の構造変数を指定できますが、これはオプションです。 ここにあなたが本の構造を宣言する方法があります-
構造体メンバーへのアクセス
構造体のメンバーにアクセスするには、* memberアクセス演算子(。)を使用します。 メンバーアクセス演算子は、構造変数名とアクセスする構造メンバーの間のピリオドとしてコーディングされます。 *struct キーワードを使用して、構造タイプの変数を定義します。 以下は、構造の使用法を説明する例です-
上記のコードをコンパイルして実行すると、次の結果が生成されます-
関数の引数としての構造
他の変数またはポインターを渡すのと非常によく似た方法で、構造体を関数の引数として渡すことができます。 上記の例でアクセスしたのと同様の方法で構造変数にアクセスします-
上記のコードをコンパイルして実行すると、次の結果が生成されます-
構造体へのポインター
次のように他の変数へのポインタを定義するのと非常に似た方法で構造体へのポインタを定義できます-
これで、上記で定義したポインター変数に構造変数のアドレスを保存できます。 構造変数のアドレスを見つけるには、次のように構造の名前の前に&演算子を配置します-
その構造へのポインタを使用して構造のメンバーにアクセスするには、次のように→演算子を使用する必要があります-
構造ポインタを使用して上記の例を書き直してみましょう。これが概念を理解しやすくなることを願っています-
上記のコードをコンパイルして実行すると、次の結果が生成されます-
ビットフィールド
ビットフィールドを使用すると、構造体にデータをパックできます。 これは、メモリまたはデータストレージが貴重な場合に特に便利です。 典型的な例-
- 複数のオブジェクトを機械語にパックします。 e.g. 1ビットフラグは圧縮できます。
- 外部ファイル形式の読み取り-非標準のファイル形式を読み取ることができます。 E.g. 9ビット整数。
Objective-Cでは、変数の後に:bit lengthを追加することにより、構造定義でこれを行うことができます。 たとえば-
ここで、packed_structには、4つの1ビットフラグf1..f3、4ビットタイプ、9ビットmy_intの6つのメンバーが含まれています。
Objective-Cは、フィールドの最大長がコンピューターの整数ワード長以下である場合、上記のビットフィールドを可能な限りコンパクトに自動的にパックします。 そうでない場合、一部のコンパイラはフィールドのメモリオーバーラップを許可し、他のコンパイラは次の単語の次のフィールドを保存します。