PowerPoint版

プログラミング演習II
2004年11月 9日(第4回)
理学部数学科・木村巌
前回までの復習





メモリとアドレス
ポインタ変数
アドレス演算子 &, 間接参照演算子 *
ポインタを引数とすることで、呼び出し元の実
引数を変更できる
constを仮引数に付けることで、実引数の変更
を抑制できる
今日学ぶこと



配列とポインタの関係
引数と配列
教科書10.1から(p. 272~)
配列とポインタの関係


ポインタと配列の密接な関係
復習:



配列とは、同じ型の値を並べて、0から順に番号
を振ったものだった
&演算子を使うと、配列の各要素のアドレス
を知ることが出来る
Sample1.cを打ち込んで、コンパイル・実行し
てみよう
配列名の仕組み




配列名は、配列の先頭要素のアドレス
Sample2.cを打ち込んで、コンパイル・実行し
てみよう
3つめのprintf()の引数となっているtestは、配
列の先頭要素test[0]のアドレスとなる.
すなわち、&test[0]となり、2つめのprintf()と同
じ結果となる
配列名の仕組み(詳細)

C FAQの6章、問6.3.から


式中に現われる型「Tの配列」という左辺値は(3
つの例外を除いて)、配列の最初の要素を指す
ポインターに意味が格下げになる。結果としてで
きるポインタの型は「Tへのポインタ」となる。
3つの例外とは、(1)配列がsizeofの引数となると
き、(2)アドレス演算 子&の引数となるとき、
(3)char型の配列を文字列リテラルで初期値する
とき
配列名から先頭要素の値を知る




配列名 == 配列の先頭要素のアドレス
よって、間接参照演算子 * を使うと
*配列名 == *配列の先頭要素のアドレス
== 配列の先頭要素の値
となる
Sample3.cを入力し、コンパイル・実行してみ
よう
配列名と先頭要素のアドレス、値
test
&test[0]
配列の先頭
要素のアド
レス
*test
test[0]
配列の先頭
要素の値
ポインタ演算の仕組みを知る

ポインタpが、ある配列の要素のアドレスであ
るとき、次のような演算を行うことが出来る



p+1, p-1, p++, p—
p1とp2が、それぞれ同じ配列の要素のアドレスの
時、p1-p2は、p1とp2の間の要素数に等しい
詳しくは、C99の6.5.6を見よ
ポインタ演算の仕組みを知る(続)


pが、例えば配列int test[5]の要素のアドレス
ならば、p+1は、次の要素のアドレスとなる
例



p = test; とすると、pはtest[0]のアドレスになる(そ
れが0x22ef18としよう)
p+1 は、test[1]のアドレスになる(0x22ef19ではな
い)
Sample4.cを打ち込んで、コンパイル・実行し
てみよう
配列とポインタの足し算

配列の要素と、ポインタの足し算
*test
test[0]
配列の先頭要素の値
*(test + 1)
test[1]
配列の二番目の要素
の値
*(test + 2)
test[2]
…
…
配列の三番目の要素
の値
…
配列名を使うときの注意



配列名と、配列の先頭要素のアドレスを格納
したポインタ変数、とは同じと思える
しかし、配列名に、別のアドレスを代入するこ
とは出来ない(ポインタ変数には出来る)
これは、配列名があくまで、配列の全要素を
格納するメモリの名前であるから
引数と配列





配列を関数の引数にする
Sample5.cを打ち込んで、コンパイル・実行し
てみよう
double avg (int t[])という関数を定義している
呼び出す際には、実引数として、配列の名前
(つまり、配列の先頭要素のアドレス)を渡す
もしavg()の中で、渡された配列の要素を変更
すると、実際に配列の要素が変更される(前
回の授業参照)
ポインタを引数として使う



double avg (int *pT)という関数を定義
avg(test)として呼ばれると、仮引数pTに、配列
testの先頭要素のアドレスが代入される
avg()の中では、ポインタの演算を使って、渡
された配列testの各要素を扱っている
ポインタに[]演算子を使う




今まで見たように、配列名を、先頭要素への
ポインタのように使うことが出来る
逆に、ポインタに[]演算子を使って、配列のよ
うに使うことも出来る
pTがある配列の先頭要素のアドレスのとき、
pT[i] で、i番目の要素を扱うことが出来る
Sample7.cを参照
今日学んだこと


配列とポインタの関係
引数と配列
レポート課題


各成分がdoubleで表される3次元ベクトルを
与えると、その長さを返す関数
double norm (double dim[])
を作成せよ(10.2節のSample5.cを参考のこ
と)
また、引数としてポインタを使ったものも作
成せよ(Sample6.cを参考のこと)
レポート課題(続)

実行例:
第一成分を入力してください:3.0
第二成分を入力してください:2.0
第一成分を入力してください:1.0
長さ = 3.741657
レポート課題(続)



締め切り:2004年11月15日一杯(日本時間
で)
提出:メールで木村([email protected])まで.
感想などあると木村が喜びます