ゆるい感じのプログラムを書きたい。

プログラムの敷居を下げて、多くの人が開発出来るように色々書いていきます!

【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);


下記、図はプログラムの解説になります。

f:id:kassans:20140319114331p:plain


次にすべてのデータ型のプログラムをこんな感じに書きます

■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リファレンスの引数で「汎用ポインタ」が記載されています。