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

これで、メモリアドレスとは何か、それにアクセスする方法を理解したので、概念の基本は終わりました。それでは、ポインタとは何かを見てみましょう。

ポインタとは何ですか?

A pointerは、値が別の変数のアドレス、つまりメモリ位置の直接アドレスである変数です。他の変数や定数と同様に、変数アドレスを格納するために使用する前に、ポインターを宣言する必要があります。ポインタ変数宣言の一般的な形式は次のとおりです。

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プログラマーにとって明らかなはずです。

シニア番号 コンセプトと説明
1 Objective-C-ポインタ演算

ポインタで使用できる算術演算子は、++、-、+、-の4つです。

2 Objective-C-ポインタの配列

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

3 Objective-C-ポインタへのポインタ

Objective-Cを使用すると、ポインタの上にポインタを置くことができます。

4 Objective-Cの関数へのポインタの受け渡し

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

5 Objective-Cの関数からポインタを返す

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