こんにちは､ そしてお帰りなさい｡
この講義では､ ポインタと配列の関係についてお話したいと思います｡
そこには強い関係があり､ 実際にポインタ演算について語る前に､ この関係を理解する必要があるのです｡
では､ さっそく始めましょう｡
配列は､ 同じ型のオブジェクトの集まりで､
1つの名前で参照することができます｡ 私たちはもう､ アレイがかなり得意であることを知っています｡
これまで数節にわたり､ 文字配列を使ってきました｡
この括弧の中にある添え字やインデックスを使ってアクセスする配列です｡
私たちはそれを覚えています｡
配列はゼロベースでゼロから始まることが分かっています｡
しかし､ これもまた､ 同じ変数名で複数の月を保持する方法なのです｡
ポインターは､ その値としてメモリアドレスを持つ変数で､
与えられた型の別の変数や定数を参照することができます｡
また､ この時点でポインタが何であるかをはっきりさせておく必要があります｡
メモリアドレスを保持するだけです｡
ポインターは､ 異なるタイミングで異なる変数のアドレスを保持するために使用することができます｡
でも､ 同じタイプでないとダメなんです｡ int型ポインタは､ int型のアドレスを復元するためにポイントする必要があります｡
配列とポインタはかなり違うように見えますが､
非常に密接な関係があり､ 特に文字配列では互換性を持って使われることがあります｡
文字列を記憶するキャラクタと､ 文字ポインタを作ることはできますが､
これは本質的に同じものです｡
キャラクタポインタでメモリを確保するか､
解放するか､ わずかな違いしかない｡
文字配列ならその必要はないのですが､
文字aもサイズが固定されています｡
つまり､ 20をサイズとする文字配列文字列を作成した場合､
19文字しか格納できないのです｡
キャラクタポインタを使えば､ 動的なメモリ管理を行うことができ､
サイズを増減させることができるので､ メモリに関してより効率的です｡
しかし､ C言語におけるポインタの最も一般的な使い方の1つは､ 配列へのポインタとしてです｡
このとき､ 特に文字へのポインタが最もよく使われます｡
文字ポインタは､ 文字配列と同じです｡
消去にポインターを使用する主な理由は､
表記上の利便性とプログラム上の効率性である｡
ですから､ 動的なメモリ管理をする場合を除き､ 多くの場合､ 配列とポインタのどちらを使ってもかまいません｡
しかし､ ほとんどの場合､ できます｡ そして､ 唯一の違いは構文であり､
表記法なのです｡
それは､ 添え字を使って要素にアクセスするかどうか､ ポイント演算を使うかどうか､
キャラクターポインターを使ってその要素の特定のアドレスを指すかどうか､
である｡
また､ 文字ポインタも同様に使用した方が効率的です｡
配列へのポインターは､ 一般に､ より少ないメモリ使用量とより速い実行速度でコードを実現します｡
だから､ 文字にはなるべくポインタを使い､ 他のデータ型にもポインタを使いたい｡
より速く､ より少ないメモリ使用量だからです｡ 配列よりポインターの方が多い｡
100個の整数の配列があれば､ int値は100と言うだけで､
この意味はわかります｡ 100はサイズです｡
つまり､ その配列には100個の整数を格納することができるのです｡
また､ ポインターを定義することもできます｡ values 配列を指しており､ この配列に含まれる整数にアクセスするために使用できるので､
これを values ポインタと名付けることにします｡
だから､ インスタ値ポインタと言うだけです｡ この時点でポインタの宣言の仕方はわかっています｡
配列の要素を指すポインタを定義する場合､ そのポインタを配列へのポインタ型として指定するのではなく､
配列へのポインタ型として指定します｡
ここまでは､ ポインタ・トゥ・エンド､ ポインタ・トゥ・ダブルという話ばかりでした｡
でも､ 配列を使うときは､ pointed arrayとは言わないんですね｡
その実際のポインタは､ 配列に含まれる特定の要素を指しています｡
だから､ そのことを心に留めておいてください｡ ポインタのアドレスをクリアしても､
実際には配列全体ではありません｡
したがって､ valuesポインタをvalues配列の最初の要素を指すように設定するには､ values
pointまたはequals valuesと言えばよいことになります｡
そこにアドレスを入れたりする必要はない｡ 値配列はポインタであるため｡
それは､ 頭の中でドライブしなければならないのは､ これらの配列はすべてフードの下にあるポインタであるということです｡
つまり､ 配列の最初の要素をポインタに代入したい場合､
equals演算子の右辺に配列を指定すれば､ 左辺には値ポインタがあるだけでよいのです｡
これは､ 配列の最初のアドレス､ または最初の要素を指すことになります｡
アドレス演算子が使われていないことに気づく｡
cコンパイラは､ 添え字のない配列名の出現を､
配列へのポインタとして扱います｡
したがって､ 添え字なしでvaluesを指定すると､ valuesの最初の要素へのポインタを生成する効果があります｡
つまり､ ポインタをインクリメントすることで､ 配列内の後続の値を指すことができるようになったのです｡
そしてそれは､ これから数回の講義で､ 点演算の話をするときに出てくるものなのです｡
そして､ それは本当に単なる表記上のことであり､ また効率的なことでもあるのです｡
したがって､ 値の先頭へのポインタを生成する等価な方法は､ rightの最初の要素に演算子のアドレスを適用することでもある｡
だから､ 2通りのやり方があって､ どちらでもいいんです｡
でも､ こんなこともできるんです｡ 値サブゼロの値ポインタアドレスと言うことができる｡
これにより､ 配列の最初の要素に値ポインタが設定されます｡
だから､ これを使ってもいいし､ バリューポイント＝バリューと言い換えてもいい｡
明らかに､ アンパサンドなし､ 下付き文字なしだと､
もう少しコードが少なくなるか､ 書きやすくなります｡
これは､ 宣言を見なければ､ 必ずしもvaluesが配列であることが分からないので､
もう少し分かりやすいかもしれません｡
でも､ やはりどちらでもいいんです｡ 値ポインタが値と等しいか､ 値ポインタが値サブゼロのアドレスと等しい｡
プログラマーの好みの問題です｡ そしてまた､ 表記上のことです｡
つまり､ もう一度言いますが､
arサブiとアスタリスクarプラスiという2つの表現があるとき､
それらは同等の意味を持つのです｡
だから､ このことを理解していただきたいのです｡
ar が配列の名前であれば､ どちらも動作します｡
ポインターを使用することも､ 参照を解除することも可能です｡
また､ ポインタ変数であれば､ どちらも動作します｡
ar plus plus のような式は ar がポインタ変数の場合のみ有効です｡
つまり､ プラス・プラスと言って配列をインクリメントしても､
次の要素に行くことはできないのです｡
配列ポインタやポインタにしかできないことです｡
つまり､ 配列へのポインタであるarがあり､ 次の要素に移動したい場合は､
毎回それをインクリメントすればよいのです｡
しかし､ ar sub iと言えば､ ar sub iは配列であり､
配列はポインタであるから､ arはポインタであり､ ar plus
iを割り当てたと言えば､
それをデリファレンスすることができる｡
そこで､ これから数回の講義で､ ポイント演算について説明しますが､
これは配列とポインタの関係に強く関連しています｡
ポインターは､ 配列にすることができます｡ ポインタ配列ではなく､ 要素です｡
つまり､ ポインタのアドレスを使って､ 配列の中を移動したり､
配列を反復したりすることができるのです｡
ありがとうございます｡