【第6回】


『内容』

<ポインタ>

 ポインタとは「指し示すもの」を意味し,C言語では,変数ならびに配列要素のデータが格納されているメモリ上のアドレス(番地)を指し示す.ポインタを使用することにより,プログラムの効率化や汎用化が図られる.ポインタの概念は,FortranやBasic等の他のプログラム言語には無く,ポインタを使ったプログラムこそC言語らしいと言われる.

1. ポインタと変数

 * :ポインタが指したアドレス内のデータ値を取り出す(間接参照演算子という).
 & :変数のアドレスを取り出す(アドレス演算子という).

2. 関数の引数としてのポインタ 3. ポインタと配列

『演習』

7.ポインタ

7.1 ポインタの概念

 変数や配列の要素のデータを格納するためのメモリ(memory)領域というものがコンピュータシステムには存在する.データを格納しているメモリ上のアドレス(address),すなわち番地が存在し,このアドレスを参照してコンピュータはデータにアクセスする.このメモリ上のアドレスを扱うのがポインタである.ポインタの持つアドレスは一定値ではなく,値を変えられるので,ポインタ変数とも呼ぶ.


7.2 ポインタの宣言

 ポインタと通常の変数の宣言の仕方で異なるのは,変数名の前に「*」を付ける点である.これにより,この変数がポインタ変数として認識される.

 教科書p.63の「プログラム7-1」を実行し,その動作を確認せよ.(教科書p.62の「文法7-1」とp.63の「文法7-2」を参照)


7.3 関数の引数としてのポインタ

 関数の()内に引数を記述すれば,その関数へ引数の値を引き渡すことができた.しかし,その呼び出された関数内で引数の値を変更しても,この関数を呼び出した元の関数(例えば,main())内では,その変更は影響されない.関数の戻り値(return文)を利用して,変更された値を戻すこともできるが,return文では,1つの値しか戻せない.グローバル変数(外部変数)を使えばできるが,メモリの有効利用の点では難がある.ポインタを引数とすれば,これらのことが全て解消される.

 教科書p.64の「プログラム7-2」とp.65の「プログラム7-3」を実行し,その動作の違いを確認せよ.(教科書のp.64の「文法7-3」を参照)

 教科書p.65の「プログラム7-4」を実行し,その動作を確認せよ.


7.4 ポインタと配列

 ポインタと配列は密接な関係にある.ポインタと配列の関係が理解できれば,配列を使った統計処理計算,特に,行列演算において効率的なプログラムを書くことができる.

7.4.1 ポインタと1次元配列

 配列名がポインタとなる.すなわち,配列num[3]を宣言した場合,numnum[0]のアドレス&num[0]を表す.言い換えると,配列名のポインタnumには,その配列の先頭アドレス(この場合,&num[0])が自動的にはいる(教科書p.67の「プログラム7-5」と「結果7-5」を参照).ただし,この配列のポインタnumは固定であり,一般のポインタ変数(例えば,ptr)のように値を変更することはできない.

 教科書p.67の「プログラム7-6」を実行し,その動作を確認せよ.

7.4.2 関数のポインタ渡しと配列

 配列名が配列のポインタとなるので,関数の引数に配列名を書くだけで,その関数に配列のポインタ渡しをすることができる.
 scanf文で,整数を入力する際に


    scanf("%d",&num);
としていたが,これは,変数numのアドレスを関数scanf()へ渡し,そのアドレスにキーボードから入力された数字を直接書き込む処理をしていたのである.ただし,char string[10];と宣言した文字列string[10]を入力する際には

    scanf("%s",string);
となる.配列名string自体がアドレスを表しているので,「&」は不要となる.下記のプログラムは,キーボードから入力した名前を表示するものである.

    #include<stdio.h>
    main()
    {
     char name[10];

     printf("Enter your name\n");
     scanf("%s",name);
     printf("Your name is %s\n",name);
    }

 教科書p.68の「プログラム7-7」を実行し,その動作を確認せよ.


レポート課題6(授業終了後にアップロード)

 RePORTシステム