Upgrade to Pro — share decks privately, control downloads, hide ads and more …

基礎情報処理演習(11)ポインタ

 基礎情報処理演習(11)ポインタ

自然言語処理研究室

November 28, 2013
Tweet

More Decks by 自然言語処理研究室

Other Decks in Programming

Transcript

  1. ポインタ 変数の住所を入れる変数 アドレス演算子 &x 変数 x の場所 間接演算子 *p ポインタ

    p の指す変数の値 ・ アドレスとは「番地」=変数を記憶している場所のこと。 ・ ポインタとはアドレスを記憶した変数のこと。 ・ どこも指さないNULLポインタというものもある。 ・ 配列はポインタを使って書くことができる。 ・ 関数を使う時は、値を渡す方法とアドレスを渡す方法がある。 ポインタまとめ 2
  2. int k = 3; int *p; k (int) 3 p

    ポインタ p を作る。 ここの int は、 ポインタが指す変数が int 型という意味。 4
  3. int k = 3; int *p; p = &k; k

    (int) 3 p ポインタ p に 編集 k の住所を代入する 5
  4. int k = 3; int *p; p = &k; printf

    (“%d”, *p); k (int) 3 p ポインタ p が指す変数(k) の値(*)、つまり3が表示される。 6
  5. ポインタの作成 int* s;  または int *s; ・ ここの int とは、 s

    の指す先が  int という意味で、ポインタ s が  int という意味ではない。 ・ s の指す変数が double なら、  double *s; となる。 アドレスの代入 s = &t; ・ 変数t の住所(アドレス)を  s に入れる。 ・ これによって、s を使って t を  操作できる。 ポインタの使い方 *s = 6; ・ ポインタ s が指す変数 t の値を  6 にする。つまり t = 6; と書くのと  同じ。よって、*s は t の別名と  考えてもよい。 7
  6. 配列名はポインタである int w[5]; w は w[0]を指す ポインタである。 配列はポインタ風にも書ける w[2] =

    3; *(w+2) = 3; と書いても同じ 関数に配列を渡す goto_sub(&w[0]); goto_sub(w); と書いても同じ。 goto_sub(&w); ではないことに注意! 8
  7. void function (int n1, int n2, int sum, int diff){

    sum = n1 + n2; diff = n1 - n2; } void main(void){ ... a = 10; b = 5; function(a, b, wa, sa); } 動かないプログラム 10 sum と diff は 正しく計算できるが wa と sa には 反映されない
  8. void function (int n1, int n2, int *sum, int *diff){

    *sum = n1 + n2; *diff = n1 - n2; } void main(void){ ... a = 10; b = 5; function(a, b, &wa, &sa); } 改良版 11 Wa と sa のアドレスを 関数に渡すことで 変数の値が変更される
  9. void set_number(int *vc, int no, int val){   int i;   for

    (i = 0; i< no; i++){ *(vc+i) = val;   } } main(){  int ary[5];  set_number(ary, 5, 0); } 配列 ary のポインタと 二つの数字を渡す 関数に配列のポインタを渡す例 配列の初期化をする関数 vc[0]~vc[no-1]に val を代入 12 set_number(&ary[0], 5, 0); と書いてもよい vc[i] = val; と書いてもよい
  10. おまけ: そう言えば... scanf_s (“%d”, &k); scanf_s で値を入力する際、&kのように変数名の 前に&をつけていたのは、  scanf_s 関数にkのアドレスを渡していたから

    です。こうしないとscanf_s関数の中で変数kの値を 操作(scanf_sの場合は数値を代入)できないため、 k ではなく&kとする必要がありました。 13