Presentation is loading. Please wait.

Presentation is loading. Please wait.

プログラミング 3 ポインタ(1).

Similar presentations


Presentation on theme: "プログラミング 3 ポインタ(1)."— Presentation transcript:

1 プログラミング 3 ポインタ(1)

2 変数の「正体」 変数:データを入れておく,名前の付いた「箱」のよ うなもの 実際は:データは計算機の記憶装置に記憶されている
記憶装置は区画に区切られ,番号が振られている(ア ドレス) 記憶装置の区画に名前を付けて使えるようにしたも の:変数 普段は記憶装置があることやそのアドレスのことは気にしな くてもよい 記憶装置やアドレスを気にしてプログラムする方法が C 言語には備わっている

3 変数のアドレスを知る 変数のアドレスは,& 演算子で知ることができる &a:変数 a のアドレス
アドレスは値なので,それを記憶できる変数(ポイン タ〈pointer〉)を考えることができる p がポインタであるとき, p = &a;:a のアドレスを p に代入する このとき,「ポインタ p は a を指している」という

4 ポインタを作る ポインタにも型がある:ポインタの型は,指す先にあ るデータの型で決まる
どんな型の変数のアドレスを保持しているかで決まる int 型の変数を指すポインタ p は, int *p; と宣言する ポインタを宣言するときは,変数名の前に「*」を付ける 複数宣言するときは「int *p, *q;」のようになる 「int 型の変数を指すポインタ(int へのポインタ)」の型名 は 「int *」

5 ポインタの指す先を知る 単項の * 演算子で,ポインタの指す先を得られる int a; int *p; a = 10; p = &a; ←p は a を指す printf(“%d\n”, *p); ← *p は a のこと *p = 20; ←p の指す先(a)が 20 になる

6 演算子についてまとめ & 演算子 変数からそのアドレスを得る * 演算子 ポインタの指す先を得る
& 演算子 変数からそのアドレスを得る int 型の変数から int * 型のアドレスが得られる * 演算子 ポインタの指す先を得る int * 型の値から int 型のオブジェクトが得られる ポインタは「指す先に何があるか」を把握して操作するこ と! ポインタが関連する式を扱うときは,型に注意!

7 練習 int a, b, *p, *q; a = 1; b = 2; p = &a; q = &b; *p += 2; b += 3; p = q; *q = 6; 各時点での a・b の値,p・q が指すもの,指す先を 追跡しましょう

8 ポインタと関数(1) アドレスを受け取る関数を作れる void func(int *p) { printf(“%d\n”, *p); return; } この関数はアドレスを渡して呼び出す int の変数 a のアドレスを渡す:func(&a); int へのポインタ p(の値)を渡す:func(p);

9 ポインタと関数(2) アドレスを返す関数も作れる int *func(int *p) { return p; }

10 ポインタと関数(1) C 言語では,関数の引数は値で渡される(変数の値の コピー)
引数の値を関数内で変更しても,その変更の影響は呼び出し 元に及ばない void func(int a) { a++; return; } X が 3 のとき,「func(x);」と呼び出しても x は 4 にはならず 3 のま ま

11 ポインタと関数(2) しかし,アドレスを渡すと,それを介して呼び出し元 の変数の値を変更できる void func(int *a) { (*a)++; return; } x が 3 のとき,func(&x) と呼び出すと x は 4 になる scanf() 関数で変数に「&」を付けて呼び出していたのはこ の仕組みを使うため

12 ポインタと関数(3) ポインタを使わないと作れない関数の処理がある
2 つの変数の値の入れ替え void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; return; } 関数の中の引数 x・y を変更しても呼び出し元の変数に影響 が及ぼせない

13 ポインタと関数(4) これならば入れ替えができる void swap(int *x, int *y) { int tmp; tmp = *x; *x = *y; *y = tmp; return; } 「ポインタ x・y の指す先」に呼び出し元の変数があるので, ポインタを介してそれらを操作して変数の値の入れ替えがで きる 呼び出し方に注意 int a, b; に対して「swap(&a, &b);」と呼び出す

14 ポインタと関数(5) 「事実上複数の値を返す」関数が作れる
a を b で割った商を q,あまりを r とする関数 void div(int a, int b, int *q, int *r) { *q = a / b; *r = a % b; } 呼び出し方は「div(x, y, &quo, &rem);」のようになる quo と rem は int 型の変数としてあらかじめ準備しておく


Download ppt "プログラミング 3 ポインタ(1)."

Similar presentations


Ads by Google