【iPhoneアプリ】これを使いこなさないと「*(ポインタ)」について 汎用ポインタ編
今回も、「*(ポインタ)」についてです。
2部構成の汎用ポインタ編になります。
これは、便利なのですが使い方がよくわからなかった為、自分なりにまとめた形で
記載します。
汎用ポインタについて
汎用ポインタはこんな感じのポインタです。
■特徴
・ポインタ型のみ存在する
・ポインタ変数のみ使用可能
・「void *」のvoid型ポインタ
■使い方
・さまざまなデータ型に変換可能
・型指定なしでさまざまなデータ型を取得する関数を作成可能
・データ型のポインタ型であればどの型でも取得可能
■注意点
・参照するにはキャストして利用すること。
・データ型のサイズが異なるので表示結果の際、保証されない。
・void型の変数は存在しない為、void型のポインタ変数のみ利用できる。
色々調べた結果、以下のC言語のデータ型のみ利用可能。
※間違っていたら教えてください。
■C言語のデータ型表
データ型名 | 変数名 | 32bitモデルのbit幅 | 32bitモデルのbit幅 |
---|---|---|---|
整数型 | short | 16 | 16 |
整数型 | unsigned short | 16 | 16 |
整数型 | int | 32 | 32 |
整数型 | long | 32 | 64 |
整数型 | unsigned | 32 | 32 |
整数型 | unsigned long | 32 | 64 |
浮動小数点型 | float | 32 | 64 |
浮動小数点型 | double | 32 | 64 |
文字型 | char | 8 | 8 |
文字型 | unsigned char | 8 | 8 |
型なし | void | - | - |
汎用ポインタの実装
では、実際にプログラムを書いて実装してみます。
プログラムをこんな感じに書きます。
char object1 = 'A'; void *object2; object2 = &object1; NSLog(@"値1:%c",*(char *)object2);
下記、図はプログラムの解説になります。
次にすべてのデータ型のプログラムをこんな感じに書きます
■ViewController.m
#import "ViewController.h" @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //変数宣言と実値を代入 char char_arr[] = "ABCDE"; char char_obj = 'A'; short short_obj = 10; int int_obj = 20; long long_obj = 30; float float_obj = 10.5; double doublie_obj = 10.5; bool bool_obj = false; //void型ポインタ宣言 void *void_arry; void *void_obj; void *void_short; void *void_int; void *void_long; void *void_float; void *void_doublie; void *void_bool; //実値のアドレスをvoid型ポインタ変数に代入 void_arry = &char_arr; void_obj = &char_obj; void_short = &short_obj; void_int = &int_obj; void_long = &long_obj; void_float = &float_obj; void_doublie = &doublie_obj; void_bool = &bool_obj; //void型ポインタ変数の表示 NSLog(@"void_array値:%s",(char *)void_arry); NSLog(@"void_array値_要素1:%c",*(char *)void_arry++); NSLog(@"void_array値_要素2:%c",*(char *)void_arry++); NSLog(@"void_array値_要素3:%c",*(char *)void_arry++); NSLog(@"void_array値_要素4:%c",*(char *)void_arry++); NSLog(@"void_array値_要素5:%c",*(char *)void_arry++); NSLog(@"char値:%c",*(char *)void_obj); NSLog(@"short値:%d",*(short *)void_short); NSLog(@"int値:%d",*(int *)void_int); NSLog(@"long値:%ld",*(long *)void_long); NSLog(@"float値:%f",*(float *)void_float); NSLog(@"double値:%f",*(double *)void_double); NSLog(@"bool値:%d",*(bool *)void_bool); }
void型ポイント変数をキャストして、以下のように値が表示されます。
labo[17175:60b] void_array値:ABCDE labo[17175:60b] void_array値_要素1:A labo[17175:60b] void_array値_要素2:B labo[17175:60b] void_array値_要素3:C labo[17175:60b] void_array値_要素4:D labo[17175:60b] void_array値_要素5:E labo[17175:60b] char値:A labo[17175:60b] short値:10 labo[17175:60b] int値:20 labo[17175:60b] long値:30 labo[17175:60b] float値:10.500000 labo[17175:60b] double値:10.500000 labo[17175:60b] bool値:0
汎用ポインタの応用
汎用ポインタの応用として、
関数の引数にvoid型のポインタ変数を定義してみましょう。
こんな感じにプログラムを書きます。
■ViewController.m
#import "ViewController.h" @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; int int_obj = 20; void *void_int; void_int = &int_obj; void_pointer(void_int); } void void_pointer(void *context) { NSLog(@"引数のvoid_ポインタ値:%d",*(int *)context); }
結果は以下のように表示されます。
labo[17399:60b] 引数のvoid_ポインタ値:20
以上、「ポインタ変数」と「汎用ポインタ」の説明になります。
たまに、APIリファレンスの引数で「汎用ポインタ」が記載されています。