ポインタ
 


ポインタとは何か?

  1. プログラム例
    char c;
    char *p;
    
    c = 10;    /*値の代入*/
    p = &c;    /*アドレスの代入*/
  2. 結果
    cの値  = 10
    *pの値 = 10

コンピュータ上で値を記憶する方法

ユーザ側:変数cに10を代入する
コンピュータ側:「1000番地(アドレス)に10を入れる」…「ある特定のアドレスに10を入れる」…
                …記号c'(変数c)のアドレスに10を入れる
コンピュータの内部表現
記号名:c' アドレス:1000 → メモリ上の1000番地に10を入れる
変数c :ユーザ側から見た概念
記号c':コンピュータの内部表現
ユーザ側    :変数cに10を代入する
コンピュータ側:記号c'の指示するアドレスに10を入れる
        = 記号c'のポイントするアドレスに10を入れる【ポインタの概念】

変数表現とポインタ表現

変数表現
    変数c     〈ある番地:アドレス〉→《10:データ》
ポインタ表現
    ポインタc'《1000:アドレス》    →《10:データ》

              〈〜〉:コンピュータ側で自動的に決定される
              《〜》:ユーザが自由に値を設定できる
変数c     :データ
ポインタc':データ & アドレス  ← アセンブラの世界!
※ C言語はポインタを扱うことによって、アセンブラと同等の細かい記述が可能

ポインタ演算子

変数とポインタの互換性

【A】変数c     〈ある番地:アドレス〉→《10:データ》
     → 変数cの収容されているアドレスは、ポインタ値(アドレス)に等しい。

【B】ポインタp《1000:アドレス》    →《10:データ》
     → ポインタpの指すアドレスの値は、変数値に等しい。

    ※ 変数とポインタ間での自由なデータの受け渡しが可能
【A】の例:変数cのアドレスを取り出せ
     アドレス(変数c) → &(c)
     ・ポインタpに変数cのアドレスを代入するには → p = &(c)

【B】の例:ポインタpの指すアドレスの値を取り出せ
     値(ポインタp) → *(p)
     ・変数cにポインタpの指すアドレスの値を代入するには → c = *(p)

【A】&【B】より  c = *( &(c) )
ポインタ演算子意 味覚え方
アドレス(ポインタ値)を取り出すアンド→アドレス
値を取り出すアスタリスク→あたい(値)

ポインタの宣言と初期化

例)ポインタpが1000番地を指しているとすると、

  char型データ(8bit=1byte) → 1000番地のデータを取り出す

  int型データ(32bit=4byte) → 1000,1001,1002,1003番地のデータを取り出す
例)int型データを取り出すポインタp
    ・pはポインタである
    ・そのポインタpはint型データの先頭アドレスを指す

    【int型データを示す】 【値は】【ポインタpの指す】 
     int *P  ← 「int型データを指すポインタp」の宣言
    【データ型】 *【ポインタ名】
宣言変数として使うポインタとして使う
int *p*pp
int ii&i

ポインタと文字列

  • C言語には文字列を一括して処理する機能はない。
  • 文字列を処理する場合は、その文字列の構成要素を1文字ずつ取り出して処理する。
  • 文字列の代入には、char型(1byte)配列を用いる。
/* 配列を用いるプログラム */
char str[4];         /* 代入する文字+1以上の領域を確保する */

str[0]='A'; str[1]='B'; str[2]='C'; str[3]=0;  /* 文字列の最後はnul */ 

printf("%s\n",str);  /* 出力は"ABC" */
/* 配列を用いないプログラム */
char *p_str;

p_str = "ABC";

printf("%s\n",p_str);

文字列のコピー

/* 配列を用いる文字列コピー */
char str_a[4],str_b[4];
int  i;

str_a[0]='A'; str_a[1]='B'; str_a[2]='C'; str_a[3]=0;

i = 0;
while(str_b[i] = str_a[i]) i++;
/* 配列を用いない文字列コピー */
char *p_a,*p_b;
int  i;

p_a = "ABC";

while(*p_b++ = *p_a++);
/* 標準関数strcpy()を用いた文字列コピー */
#include <string.h>
…
char str_a[4],str_b[4];

strcpy(str_a,"ABC");
strcpy(str_b,str_a);

ポインタの代入式

ポインタの位置代入式説 明
左辺p = str配列str[]の先頭アドレスの代入
p = &var変数valの先頭アドレスを代入
p = "ABC"文字列"ABC"を確保(領域の大きさは"ABC"+1)し、その先頭アドレスを代入
p = ppポインタppの値(アドレス)を、ポインタpに代入
右辺var = *pポインタpの指すアドレスの値を、変数valに代入
pp = pポインタpの値(アドレス)を、ポインタppに代入

char型&int型ポインタのサンプルプログラム

char str[]  = {"ABCabc"};
int  nint[] = {123,456,789,987};

int main(){

  char *pc;
  int  *pi;
  
  for(pc = str; *pc; pc++){
    printf("pc:%%x=%08x  *pc:%%x=%08x,%%c=%c\n",pc,*pc,*pc);
  }
  printf("pc:%%x=%08x  *pc:%%x=%08x,%%c=%c\n",pc,*pc,*pc);
 
  for(pi = nint; pi<(nint+4); pi++){
    printf("pi:%%x=%08x  *pi:%%x=%08x,%%d=%d\n",pi,*pi,*pi);
  }
  printf("pi:%%x=%08x  *pi:%%x=%08x,%%d=%d\n",pi,*pi,*pi);
      
  return(0);
}
/*
pc:%x=00402010  *pc:%x=00000041,%c=A
pc:%x=00402011  *pc:%x=00000042,%c=B
pc:%x=00402012  *pc:%x=00000043,%c=C
pc:%x=00402013  *pc:%x=00000061,%c=a
pc:%x=00402014  *pc:%x=00000062,%c=b
pc:%x=00402015  *pc:%x=00000063,%c=c
pc:%x=00402016  *pc:%x=00000000,%c=
pi:%x=00402018  *pi:%x=0000007b,%d=123
pi:%x=0040201c  *pi:%x=000001c8,%d=456
pi:%x=00402020  *pi:%x=00000315,%d=789
pi:%x=00402024  *pi:%x=000003db,%d=987
pi:%x=00402028  *pi:%x=00000000,%d=0
*/


添付ファイル: filesample1.c 610件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-05-28 (木) 12:35:42 (1608d)