• 検索結果がありません。

配列とポインタの関係 配列とポインタの関係

N/A
N/A
Protected

Academic year: 2021

シェア "配列とポインタの関係 配列とポインタの関係"

Copied!
19
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラミング演習

プログラミング演習 II II

20042004 年年 1111 月 月 99 日(第日(第 44 回)回)

理学部数学科・木村巌 理学部数学科・木村巌

(2)

前回までの復習 前回までの復習

メモリとアドレスメモリとアドレス

ポインタ変数ポインタ変数

アドレス演算子 アドレス演算子 &, &, 間接参照演算子 間接参照演算子 **

ポインタを引数とすることで、呼び出しポインタを引数とすることで、呼び出し 元の実引数を変更できる

元の実引数を変更できる

constconst を仮引数に付けることで、実引数のを仮引数に付けることで、実引数の 変更を抑制できる

変更を抑制できる

(3)

今日学ぶこと 今日学ぶこと

配列とポインタの関係配列とポインタの関係

引数と配列引数と配列

教科書教科書 10.110.1 から(から( p. 272p. 272 ~)~)

(4)

配列とポインタの関係 配列とポインタの関係

ポインタと配列の密接な関係ポインタと配列の密接な関係

復習:復習:

配列とは、同じ型の値を並べて、配列とは、同じ型の値を並べて、 00 から順にから順に 番号を振ったものだった

番号を振ったものだった

&& 演算子を使うと、配列の各要素のアド演算子を使うと、配列の各要素のアド レスを知ることが出来る

レスを知ることが出来る

Sample1.cSample1.c を打ち込んで、コンパイル・実を打ち込んで、コンパイル・実 行してみよう

行してみよう

(5)

配列名の仕組み 配列名の仕組み

配列名は、配列の先頭要素のアドレス配列名は、配列の先頭要素のアドレス

Sample2.cSample2.c を打ち込んで、コンパイル・実を打ち込んで、コンパイル・実 行してみよう

行してみよう

33 つめのつめの printf()printf() の引数となっているの引数となっている testtest は、配列の先頭要素

は、配列の先頭要素 test[0]test[0] のアドレスとのアドレスと なる.なる.

すなわち、すなわち、 &test[0]&test[0] となり、となり、 22 つめのつめの printprint f()f() と同じ結果となると同じ結果となる

(6)

配列名の仕組み(詳細)

配列名の仕組み(詳細)

C FAQC FAQ のの 66 章、問章、問 6.3.6.3. からから

式中に現われる型「式中に現われる型「 TT の配列」という左辺値の配列」という左辺値 は(は( 33 つの例外を除いて)、配列の最初の要素つの例外を除いて)、配列の最初の要素

を指すポインターに意味が格下げになる。結果 を指すポインターに意味が格下げになる。結果

としてできるポインタの型は「

としてできるポインタの型は「 TT へのポインへのポイン タ」となる。

タ」となる。

33 つの例外とは、つの例外とは、 (1)(1) 配列が配列が sizeofsizeof の引数となの引数とな るとき、るとき、 (2)(2) アドレス演算 子アドレス演算 子 && の引数となるの引数となる とき、とき、 (3)char(3)char 型の配列を文字列リテラルで初型の配列を文字列リテラルで初

期値するとき 期値するとき

(7)

配列名から先頭要素の値を知る 配列名から先頭要素の値を知る

配列名 配列名 == == 配列の先頭要素のアドレス配列の先頭要素のアドレス

よって、間接参照演算子 よって、間接参照演算子 * * を使うとを使うと

** 配列名 配列名 == *== * 配列の先頭要素のアドレス配列の先頭要素のアドレス

== == 配列の先頭要素の値配列の先頭要素の値

となるとなる

Sample3.cSample3.c を入力し、コンパイル・実行しを入力し、コンパイル・実行し てみようてみよう

(8)

配列名と先頭要素のアドレス、

配列名と先頭要素のアドレス、

値 値

testtest &test[0]&test[0] 配列の先頭配列の先頭 要素のアド 要素のアド レスレス

*test

*test test[0]test[0] 配列の先頭配列の先頭 要素の値要素の値

(9)

ポインタ演算の仕組みを知る ポインタ演算の仕組みを知る

ポインタポインタ pp が、ある配列の要素のアドレが、ある配列の要素のアドレ スであるとき、次のような演算を行うこ スであるとき、次のような演算を行うこ

とが出来る とが出来る

p+1, p-1, p++, p—p+1, p-1, p++, p—

p1p1 p2p2 が、それぞれ同じ配列の要素のアドが、それぞれ同じ配列の要素のアド レスの時、

レスの時、 p1-p2p1-p2 は、は、 p1p1 p2p2 の間の要素数の間の要素数 に等しいに等しい

詳しくは、詳しくは、 C99C99 6.5.66.5.6 を見よを見よ

(10)

ポインタ演算の仕組みを知る ポインタ演算の仕組みを知る

(続) (続)

pp が、例えば配列が、例えば配列 int test[5]int test[5] の要素のアドレの要素のアドレ スならば、

スならば、 p+1p+1 は、次の要素のアドレスとは、次の要素のアドレスと なるなる

例例

p = test; p = test; とすると、とすると、 pp test[0]test[0] のアドレスになのアドレスにな る(それが

る(それが 0x22ef180x22ef18 としよう)としよう)

p+1 p+1 は、は、 test[1]test[1] のアドレスになる(のアドレスになる( 0x22ef190x22ef19 はない)はない)

Sample4.cSample4.c を打ち込んで、コンパイル・実行を打ち込んで、コンパイル・実行 してみよう

してみよう

(11)

配列とポインタの足し算 配列とポインタの足し算

配列の要素と、ポインタの足し算配列の要素と、ポインタの足し算

*test

*test test[0]test[0] 配列の先頭要素の値配列の先頭要素の値

*(test + 1)

*(test + 1) test[1]test[1] 配列の二番目の要素配列の二番目の要素 の値の値

*(test + 2)

*(test + 2) test[2]test[2] 配列の三番目の要素配列の三番目の要素 の値の値

(12)

配列名を使うときの注意 配列名を使うときの注意

配列名と、配列の先頭要素のアドレスを配列名と、配列の先頭要素のアドレスを 格納したポインタ変数、とは同じと思え 格納したポインタ変数、とは同じと思え るる

しかし、配列名に、別のアドレスを代入しかし、配列名に、別のアドレスを代入 することは出来ない(ポインタ変数には することは出来ない(ポインタ変数には 出来る)出来る)

これは、配列名があくまで、配列の全要これは、配列名があくまで、配列の全要 素を格納するメモリの名前であるから 素を格納するメモリの名前であるから

(13)

引数と配列 引数と配列

配列を関数の引数にする配列を関数の引数にする

Sample5.cSample5.c を打ち込んで、コンパイル・実行しを打ち込んで、コンパイル・実行し てみようてみよう

double avg (int t[])double avg (int t[]) という関数を定義しているという関数を定義している

呼び出す際には、実引数として、配列の名前呼び出す際には、実引数として、配列の名前

(つまり、配列の先頭要素のアドレス)を渡

(つまり、配列の先頭要素のアドレス)を渡

もしもし avg()avg() の中で、渡された配列の要素を変更の中で、渡された配列の要素を変更 すると、実際に配列の要素が変更される(前 すると、実際に配列の要素が変更される(前

(14)

ポインタを引数として使う ポインタを引数として使う

double avg (int *pT)double avg (int *pT) という関数を定義という関数を定義

avg(test)avg(test) として呼ばれると、仮引数として呼ばれると、仮引数 pTpT にに

、配列、配列 testtest の先頭要素のアドレスが代入さの先頭要素のアドレスが代入さ れるれる

avg()avg() の中では、ポインタの演算を使っての中では、ポインタの演算を使って

、渡された配列

、渡された配列 testtest の各要素を扱っているの各要素を扱っている

(15)

ポインタに

ポインタに

[][]

演算子を使う 演算子を使う

今まで見たように、配列名を、先頭要素今まで見たように、配列名を、先頭要素 へのポインタのように使うことが出来る へのポインタのように使うことが出来る

逆に、ポインタに逆に、ポインタに [][] 演算子を使って、配演算子を使って、配 列のように使うことも出来る

列のように使うことも出来る

pTpT がある配列の先頭要素のアドレスのとがある配列の先頭要素のアドレスのと き、き、 pT[i] pT[i] で、で、 ii 番目の要素を扱うことが番目の要素を扱うことが 出来る出来る

Sample7.cSample7.c を参照を参照

(16)

今日学んだこと 今日学んだこと

配列とポインタの関係配列とポインタの関係

引数と配列引数と配列

(17)

レポート課題 レポート課題

各成分が各成分が doubledouble で表されるで表される 33 次元ベクト次元ベクト ルを与えると、その長さを返す関数

ルを与えると、その長さを返す関数 double norm (double dim[])

double norm (double dim[]) を作成せよ(

を作成せよ( 10.210.2 節の節の Sample5.cSample5.c を参考を参考 のこと)のこと)

また、引数としてポインタを使ったものまた、引数としてポインタを使ったもの も作成せよ(

も作成せよ( Sample6.cSample6.c を参考のこと)を参考のこと)

(18)

レポート課題(続)

レポート課題(続)

実行例:実行例:

第一成分を入力してください:

第一成分を入力してください: 3.03.0 第二成分を入力してください:

第二成分を入力してください: 2.02.0 第一成分を入力してください:

第一成分を入力してください: 1.01.0 長さ 長さ = 3.741657= 3.741657

(19)

レポート課題(続)

レポート課題(続)

締め切り:締め切り: 20042004 年年 1111 月月 1515 日一杯(日本日一杯(日本 時間で)時間で)

提出:メールで木村(提出:メールで木村(

[email protected]

[email protected])まで.)まで.

感想などあると木村が喜びます感想などあると木村が喜びます

参照

関連したドキュメント

このような情念の側面を取り扱わないことには それなりの理由がある。しかし、リードもまた

( 同様に、行為者には、一つの生命侵害の認識しか認められないため、一つの故意犯しか認められないことになると思われる。

高(法 のり 肩と法 のり 尻との高低差をいい、擁壁を設置する場合は、法 のり 高と擁壁の高さとを合

つまり、p 型の語が p 型の語を修飾するという関係になっている。しかし、p 型の語同士の Merge

Q7 

2) ‘disorder’が「ordinary ではない / 不調 」を意味するのに対して、‘disability’には「able ではない」すなわち

「海にまつわる思い出」「森と海にはどんな関係があるのか」を切り口に

すなわち、5 馬力(5PS、5HP の表示) 、あるいは 3 馬力(3PS、5HP の表示)に ついては、それぞれ 3.73kW、2.24kW