プログラミング入門

ポインタを使ってみよう

この章ではポインタについての具体例と配列のアドレスとポインタについて説明します。
以下の例は変数のアドレスを関数に渡し、ポインタ変数で受け取っている例です。 関数本体では以下のようにアドレスをポインタを受け取ります。 tashizan関数の中で*aと5を足して*aに代入し、*bと5を足して*bに代入しています。
*aには変数xのアドレスが入っているので、*aとxは同じ意味になります。
*bには変数yのアドレスが入っているので、*bとyは同じ意味になります。
つまり、*aは2と5を足して7になりましたが、*aが7になることによって、main関数の中のxが7に変わっています。
*bは4と5を足して9になりましたが、*bが9になることによって、main関数の中のyが9に変わっています。 次の例では配列のアドレスとポインタについて説明します。 もしくは以下のように書くことができます。 printf関数の変換指定文字を「%p」にして配列を出力すると配列の先頭のアドレスを取得することが出来ます。
つまり、配列のアドレスは配列の先頭の要素のアドレスになります。
つまり、配列名を書くだけで配列xの一番前のアドレスが取得出来ます。
と同じ結果はと書いても得ることが出来ます。
つまり、xと&x[0] (配列の先頭の要素のアドレス)はまったく同じアドレスです。
配列名でアドレスを取得するのとは違ってのアドレスを取得するには「&」を付けなくてはいけません。 それはのようにと記述してください。
xが先頭のアドレスを示すので、+1を付け加えることで先頭から一つアドレスを進めると言う意味になります。
つまり、と同じ意味になります。
は前から2番目のアドレスです。
*(x+0)と書くと配列の先頭要素を取り出すことが出来ます。
これを書き換えるととなります。
配列の2番目の要素を取り出すにはと書きます。
+1は先頭から一つアドレスを進めると言う意味になります。 結果は以下の通りです。次の例ではポインタの加算を使った値の書き換えの方法について説明します。 hairetsu(x);の箇所で配列xのアドレスをhairetsu関数のポインタ変数に渡しています。 hairetsu関数内で書き換えた結果、main関数の配列xの要素である「1,2,3」が「34,46,98」に書き換えられます。
先ほどの例をfor文を使って書き換えると以下のようになります。 次はポインタに関する演算について説明します。 この例ではポインタ *gに配列xのアドレスを入れています。
1 gにはxの先頭要素のアドレスが入っているので、「*」を付けることで1番前の要素を得ることが出来ます。
結果は4です。 g++;とありますが、これはポインタの指している位置を1つ先に進めると言う意味です。
ポインタを進めた後にと出力すると、前から2番目の要素の値である6を得ることが出来ます。
さらにポインタの指している位置を進めると8が得られます。
3 この箇所はポインタを戻しています。
ポインタをのように減算子を使って書くと、その時点のポインタから1つ後ろに戻る動作をします。
つまり8の時点から1つ下がるので6が得られます。
では次の例を見てみましょう。 これまでは配列のアドレスを関数本体に渡す時、ポインタで受け取っていましたが今度は他の方法で配列を関数に渡します。
hairetsu(x);のように配列のアドレスを渡すまでは同じですが、関数本体のほうはのように配列で受け取っています。
そして要素の数(3)だけ繰り返しループして、の結果をg配列に代入しています。
つまりg[i]のiに0から2までが代入され、その都度の計算結果が代入されることになります。 配列xと配列gはまったく同じなので(xもgも同じアドレスを示しています)、この例の結果は「10と10と10」になります。
では次の例に進みます。 仮引数にポインタを指定した場合、これまでは のように代入していましたが、実はこのような難しい表現を使わなくてものようにポインタにを付けて値を代入することもできます。
g[i]のiに0から2までが代入され、その都度の計算結果を代入します。 結果は「6と6と6」です。
次は文字列を扱う配列とポインタの関係について説明します。 配列の章で学習しましたが、文字列を配列で扱う時には型をcharにして、のように書きます。
と同じことをポインタを使って書き換えるとのように書くことが出来ます。
出力する時には もしくは と書きます。 ポインタを使ったのような書き方では再度のように代入(上書き)することができます。
では次の例に進みます。 関数の引数にポインタを使用している場合に、引数の値を変更したくない時があります。
そのような時にconstを変数の前に指定します。
constをつけることにより、引数の中身を書き換えないことを明確にできるメリットがあります。
関数の引数に const を指定すると、その関数の中では値を書き換えることができなくなります。
ですので、のような記述はできませんので、この例はエラーになります。
次の例は2次元配列とポインタの関係を学習します。 複数の文字列を配列に入れるには配列のポインタを使用します。 例ではの箇所です。
出力する方法は普通の配列と同じように添え字を使って出力します。