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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

Avatar for 自然言語処理研究室

自然言語処理研究室

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