関数の中で配列をポインタとして使いたい。
関数の戻り値に配列を使うとどうなるの?
この記事を読めば、これらの悩みを解決できます。
タイトルを見た人はわかるかと思いますが、配列はポインタとして使うことができます。
今回は配列をポインタとして使った関数の説明をします。配列、ポインタが分からない人は、こちらの記事を参考にしてください。
配列はポインタ?!
関数でアドレス渡しする方法を知りたい人は、こちらを参考にしてください。
配列をポインタとして使うことができるのは、関数を使ったときのみです。
前回のポインタの部分を配列に変えることができるといった方が分かりやすいでしょうか?
数字を3倍するプログラムを作りながら説明していきます。
プロトタイプ宣言
void sanbai(int b[]);
関数を使うので最初にプロトタイプ宣言をします。
見ると分かると思うのですが、カッコの中の配列の中を空にしてプロトタイプ宣言します。
このように、「int b[]」とすることで「main関数」の配列「b」を関数の中で使うことができます。
main関数
int main()
{
int b[1];
b[0]= 5;
sanbai(b);
printf("%d",b[0]);
}
まだ教えていないところですが、このようにして「main関数」で2個の変数を使うことができます。(b[0]とb[1]の2つです。)
このときb[1]には数字を代入できません。
この辺の説明は次回やろうと思います。順番前後してしまいました。すみません。
分からなかったら今回は無視で大丈夫です。
なので、b[0]に5を代入しています。
その後ろは「sanbaiという自作関数を使う」を意味しています。引数には「b」が入っていますが、「int b[1];」で変数宣言した変数全てのアドレスを自作関数に渡すことができます。
つまり、こうすることでb[0]とb[1]の2つを引数として渡すことができます。
この直後を見ると「printf」が来ていてこのまま出力されると5が出力されるんじゃないかと思うかもしれませんが違います。
「sanbaiという自作関数を使う」と前の文章で言っているので、先に「自作関数がどうなっているか」を見る必要があります。
それでは自作関数の部分を見ていきましょう。
自作関数
void sanbai(int b[])
{
b[0]*=3;
}
最初の1文を見てみましょう。
main関数から受け取ったアドレスが、配列「b」のものであることを意味しています。
自作関数の中はb[0]を3倍するだけです。
自作関数でb[0]が3倍されたので「main関数」の「printf」では3倍された値が出力されます。
ここまでをまとめてみましょう。
#include<stdio.h>
void sanbai(int b[]);
int main()
{
int b[1];
b[0]= 5;
sanbai(b);
printf("%d",b[0]);
}
void sanbai(int b[])
{
b[0]*=3;
}
このようになります。では、出力してみましょう。
5×3で15が出力されました。
忙しかったらここだけ見よう!(アドレスと変数の使い分け)
変数とポインタと配列では、「代入された数値」(代入される数値)、「アドレス」の表し方がそれぞれ異なります。データ型にはintを用いて説明します。
変数「int a;」での代入された数値、アドレスの表し方
変数での値の表し方:a(そのまま)
変数でのアドレスの表し方:&a(&付ける)
ポインタ「int *pa」での代入された数値、アドレスの表し方
ポインタでの値の表し方:*pa(そのまま)
ポインタでのアドレスの表し方:pa(*取る)
配列「int a[配列数+1]」での代入された数値、アドレスの表し方
配列での値の表し方:a[ ](数字取る)
配列でのアドレスの表し方:a([ ]も取る)
例えば、ポインタ「*pa」に変数「a」のアドレスを代入したいときは
pa=&pa;
のように表します。
まとめ
難しかったら、とりあえず「忙しかったらここだけ見よう!」のところに目を通すといいと思います。
次は、マクロを勉強しましょう。
コメント