プログラミング演習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])まで. 感想などあると木村が喜びます
© Copyright 2024 ExpyDoc