next up previous contents
Next: 13. 関数 III Up: 12. ポインタ I Previous: 5. ポインタの演算

6. 課題 12

cd c を実行した後で( ~/c に移動した後で )、以下の課題を やってみよ。

課題 12.1
アドレスを見る

以下のプログラムを実行し、型によって同じインクリメントでもアドレスの変化が 違うことを確認せよ。


        char a, *pa;
        float x, *px;

        a = 'P'; x = 2.5;
        pa = &a; px = &x
        printf("address of a is %u\n", pa);
        printf("address of x is %u\n", px);
        pa++; px++;
        printf("next address of a is %u\n", pa);
        printf("next address of x is %u\n", px);

課題 12.2
文字列操作 I

例9 を動かしてみよ。

課題 12.3
文字列操作 II

与えられた文字列の終わりの文字をポインタを用いて探し出し、表示せよ。 つまり、与えられた文字列 "abcde" に対して、文字 'e' を表示 するプログラムを作成せよ。


ヒント
       char *s="abcde";
       char *p;
       for(p=s; ...; p++);
       ...
       printf("最後の文字は %c\n", *p);

課題 12.4
文字列操作 III

与えられた文字列をポインタを用いて、逆さに出力するプログラムを作成せよ。 文字列は、"wakkanai" とする。従って、ianakkaw と出力されること。

ヒント
課題 12.3 を用いる。

出来たプログラムを creport 宛に送りなさい。但し、subject は、kadai12 と すること。

前回の復習
ポインタ
メモリ上の場所を指差するもの
アドレス演算子
変数の前から作用させて、変数のアドレスを取得する printf("address is %u\n", &a);
ポインタ変数
アドレスを格納するための変数
  1. 指しているデータ型は変更不可能(宣言時に決定される)
  2. 指しているデータのアドレスは変更可能
ポインタ変数の宣言


              int *p;
              int *x1, *x2;
              char *pc;
変数の前に、* を置くと、ポインタ変数になる。

文字列
文字列はアドレスそのものとして表現されている

              char *s = "this is a test";
この場合、ポインタ変数 s には、"this is a test" という文字列の メモリ中でのアドレスが格納され、最初の this の 't' へのポインタになっている。

文字列の終わり

メモリ中では目印として文字列の最後に、特別な値が書き込まれていて、それは C 言語 では '\0' としてあらわす。

間接参照演算子 *

ポインタ変数が指しているデータの中身を操作したい場合には、間接参照演算子を 用いる。

              int *p, x;
              x=12;
              p=&x;     /* p は x をポイントしている */
              *p=13;    /* x の中身に 13 が代入されている */

ポインタの演算

ポインタ変数についての演算を行うことが出来るが、注意点として、そのポインタ変数 が指しているデータ型によって演算結果が異なることがある。

              int *pi, x; char *pc, c;
              pi=&x; pc=&c;
              pi++;  pc++;
この場合、pi++pc++ とでは増え方が違っている。つまり、 ポインタ変数の加減乗除は、アドレスを加減するのではなく、データ型の大きさ分の 加減乗除を行うようになっている。そのために、pi++ は、整数型変数一個 分の大きさだけアドレスを増やし、pc++ は、文字型変数一個分の大きさだけ アドレスを増やす結果となる。



Noriyo Kanayama 平成14年11月26日