Objective-c-pointers

提供:Dev Guides
移動先:案内検索

Objective-Cポインター

Objective-Cのポインターは簡単で楽しく学ぶことができます。 一部のObjective-Cプログラミングタスクはポインターを使用してより簡単に実行でき、動的メモリ割り当てなどの他のタスクはポインターを使用しないと実行できません。 したがって、完璧なObjective-Cプログラマーになるには、ポインターを学ぶ必要があります。 簡単で簡単な手順で学習を始めましょう。

ご存じのように、すべての変数はメモリロケーションであり、すべてのメモリロケーションには、メモリ内のアドレスを示すアンパサンド(&)演算子を使用してアクセスできるアドレスが定義されています。 定義された変数のアドレスを出力する次の例を考えてください-

#import <Foundation/Foundation.h>

int main () {
   int  var1;
   char var2[10];

   NSLog(@"Address of var1 variable: %x\n", &var1 );
   NSLog(@"Address of var2 variable: %x\n", &var2 );

   return 0;
}

上記のコードをコンパイルして実行すると、次のような結果が生成されます-

2013-09-13 03:18:45.727 demo[17552] Address of var1 variable: 1c0843fc
2013-09-13 03:18:45.728 demo[17552] Address of var2 variable: 1c0843f0

したがって、メモリアドレスとそのアクセス方法を理解したので、コンセプトの基本は終わりました。 次に、ポインターとは何かを見てみましょう。

ポインターとは

  • ポインタ*は、値が別の変数のアドレス、つまりメモリ位置の直接アドレスである変数です。 他の変数や定数と同様に、ポインターを使用して変数アドレスを保存する前に、ポインターを宣言する必要があります。 ポインタ変数宣言の一般的な形式は-
type *var-name;

ここで、 type はポインターの基本型です。有効なObjective-Cデータ型である必要があり、 var-name はポインター変数の名前です。 ポインターの宣言に使用したアスタリスク*は、乗算に使用したものと同じアスタリスクです。 ただし、このステートメントでは、変数をポインターとして指定するためにアスタリスクが使用されています。 有効なポインター宣言は次のとおりです-

int    *ip;   /*pointer to an integer*/
double *dp;   /*pointer to a double*/
float  *fp;   /*pointer to a float*/
char   *ch    /*pointer to a character*/

すべてのポインターの値の実際のデータ型は、整数、浮動小数点、文字、またはその他のいずれであっても同じで、メモリアドレスを表す長い16進数です。 異なるデータ型のポインターの唯一の違いは、ポインターが指す変数または定数のデータ型です。

ポインターの使用方法

重要な操作はほとんどなく、非常に頻繁にポインターを使用して行います。 (a)*ポインター変数を定義し、(b)変数のアドレスをポインターに割り当て、(c)がポインター変数で使用可能なアドレスの値に最終的にアクセスします。 これは、オペランドで指定されたアドレスにある変数の値を返す単項演算子**を使用して行われます。 次の例では、これらの操作を利用しています-

#import <Foundation/Foundation.h>

int main () {
   int  var = 20;   /*actual variable declaration*/
   int  *ip;        /*pointer variable declaration*/
   ip = &var;      /* store address of var in pointer variable*/

   NSLog(@"Address of var variable: %x\n", &var  );

  /*address stored in pointer variable*/
   NSLog(@"Address stored in ip variable: %x\n", ip );

  /*access the value using the pointer*/
   NSLog(@"Value of *ip variable: %d\n", *ip );

   return 0;
}

上記のコードをコンパイルして実行すると、次のような結果が生成されます-

2013-09-13 03:20:21.873 demo[24179] Address of var variable: 337ed41c
2013-09-13 03:20:21.873 demo[24179] Address stored in ip variable: 337ed41c
2013-09-13 03:20:21.874 demo[24179] Value of *ip variable: 20

Objective-CのNULLポインター

正確なアドレスが割り当てられていない場合に備えて、ポインタ変数にNULL値を割り当てることを常にお勧めします。 これは、変数宣言時に行われます。 NULLが割り当てられたポインターは、 null ポインターと呼ばれます。

NULLポインターは、いくつかの標準ライブラリで定義されている値がゼロの定数です。 次のプログラムを検討してください-

#import <Foundation/Foundation.h>

int main () {
   int  *ptr = NULL;
   NSLog(@"The value of ptr is : %x\n", ptr  );
   return 0;
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0

ほとんどのオペレーティングシステムでは、アドレス0のメモリにアクセスすることは許可されていません。これは、メモリがオペレーティングシステムによって予約されているためです。 ただし、メモリアドレス0には特別な意味があります。ポインタがアクセス可能なメモリ位置を指すように意図されていないことを通知します。 ただし、慣例により、ポインターにNULL(ゼロ)値が含まれている場合、ポインターは何も指していないと見なされます。

NULLポインタを確認するには、次のようにif文を使用することができます-

if(ptr)    /*succeeds if p is not null*/
if(!ptr)   /*succeeds if p is null*/

Objective-Cポインターの詳細

ポインターには多くの簡単な概念があり、Objective-Cプログラミングにとって非常に重要です。 次のいくつかの重要なポインタの概念があります。これらは、Objective-Cプログラマには明らかなはずです-

Sr.No. Concept & Description
1

Objective-C - Pointer arithmetic

ポインターで使用できる4つの算術演算子があります:+、-、、-

2

Objective-C - Array of pointers

配列を定義して、多数のポインターを保持できます。

3

Objective-C - Pointer to pointer

Objective-Cを使用すると、ポインターをポインターに合わせることができます。

4

Passing pointers to functions in Objective-C

参照またはアドレスの両方で引数を渡すと、呼び出された関数によって、呼び出された関数で渡された引数を変更できます。

5

Return pointer from functions in Objective-C

Objective-Cでは、関数がローカル変数、静的変数、および動的に割り当てられたメモリへのポインターも返すことができます。