main関数内で定義された配列に格納されているデータをポインタ変数を使った自作関数によって操作を加え変更してみましょう そのため配列のアドレスを自作関数の引数にポインタ渡しする方法を学んでみましょう

main関数内で配列宣言された配列の配列変数に格納されている数値データだけを自作関数の引数に配列宣言でなく配列変数を用いることにより実行、すなわち値渡しすることができます。



ソーラー「自作関数の引数となっているint hairetu[]によって生成される


配列変数


hairetu[0]

hairetu[1]

hairetu[2]


main関数内で定義された配列newhairetuの配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]



格納されているデータをわたすときは


       💖配列newhairetuのアドレスを格納したポインタ変数newhairetu💖


int hairetu[]に代入していました。


つまり


配列newhairetuのアドレスを


自作関数の引数int hairetu[]によって生成される


配列hairetuのアドレスを格納しているポインタ変数hairetu


に渡すことにより


配列hairetuのアドレスを格納したポインタ変数hairetu



配列newhairetuのアドレスを格納したポインタ変数newhairetu


には同じアドレスが格納されることになります


この場合


hairetu

hairetu+1

hairetu+2


newhairetu

newhairetu+1

newhairetu+2


は同じアドレスを格納していることになります


配列変数


hairetu[0]

hairetu[1]

hairetu[2]


main関数内で定義された配列newhairetuの配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

のアドレスを格納しているのは


hairetu

hairetu+1

hairetu+2


newhairetu

newhairetu+1

newhairetu+2

なので


hairetu

hairetu+1

hairetu+2


newhairetu

newhairetu+1

newhairetu+2


が同じアドレスを格納しているならば



配列変数


hairetu[0]

hairetu[1]

hairetu[2]


main関数内で定義された配列newhairetuの配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

は同じアドレスのメモリにアクセスすることになります


つまり


配列変数


hairetu[0]

hairetu[1]

hairetu[2]


main関数内で定義された配列newhairetuの配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]


同じ値を持つことになります


ですので


           🌞自作関数の実行により🌞


配列変数


hairetu[0]

hairetu[1]

hairetu[2]

に格納されているデータが変更されると


main関数内で定義された配列newhairetuの配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

に格納されているデータも変更されることになります




このように



自作関数の引数となっているint hairetu[]に


       💖配列newhairetuのアドレスを格納したポインタ変数newhairetu💖


代入することを


参照渡し(ポインタ渡し)といいます


参照渡し(ポインタ渡し)をおこなえば


                  😊自作関数を実行😊


          🌟main関数内で定義された配列newhairetuの配列変数🌟


newhairetu[0]

newhairetu[1]

newhairetu[2]

に格納されているデータを変更することができるのですね



そして


自作関数の引数となっているint hairetu[]には


配列newhairetuのアドレスを格納したポインタ変数newhairetuをわたすことしかできません


この参照渡し(ポインタ渡し)の方法しかなく


値渡しはできなかったね。


では😊


main関数内で定義された配列の


格納されている数値データを



自作関数の引数に直接代入することにより


値渡しすることは可能なのでしょうか?


どう 思う?」


アレサ「普通に考えると


次のようにプログラムを構成して確かめてみればよいのではないですか?


まず


void newmadefunction(int x)のように

👆

自作関数の


引数をint xに設定します


次に


main関数内の配列宣言、初期化


int newhairetu={1,2,3,4,5};

により


配列newhairetu内に生成された


配列変数

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]

newhairetu[0]=1;

newhairetu[1]=2;

newhairetu[2]=3;

newhairetu[3]=4;

newhairetu[4]=5;


と数値データを格納します


あとは自作関数の引数int xに


配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


を直接

代入することにより

数値データ

1

2

3

4

5


自作関数の引数int xに


渡してあげればいいのですの。


そのプログラムは


次のようになります。」


#include <stdio.h>


void newmadefunction(int x){


x=x*2;

printf("%d\n",x);

}


int main (void){

int newhairetu[]={1,2,3,4,5};


newmadefunction(newhairetu[0]);

newmadefunction(newhairetu[1]);

newmadefunction(newhairetu[2]);

newmadefunction(newhairetu[3]);

newmadefunction(newhairetu[4]);


/*自作関数newmadefunction(int x)の引数であるint xに

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]

を代入しています*/


printf("%d\n",newhairetu[0]);

printf("%d\n",newhairetu[1]);

printf("%d\n",newhairetu[2]);

printf("%d\n",newhairetu[3]);

printf("%d\n",newhairetu[4]);


return 0;

}


コンパイル結果


2

4

6

8

10

1

2

3

4

5


アレサ「


自作関数の引数であるint xに


直接

配列newhairetu内の配列変数

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


を代入


つまり


値渡しをして


自作関数の引数であるint xに

数値データ

1

2

3

4

5

だけを渡して


自作関数による操作を加え


コンパイル結果

2

4

6

8

10

を表示することができました。


配列変数

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]

をつかっての


数値データの


値渡しに成功です。


              値渡しされているので


main関数内で定義された


配列newhairetu内の配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


に格納されている数値データは


コンパイル結果をみてもわかるように


                自作関数の操作を受けず

          


newhairetu[0]=1

newhairetu[1]=2

newhairetu[2]=3

newhairetu[3]=4

newhairetu[4]=5


のまま変化していません」


ソーラー「やったね


配列変数を自作関数の引数に代入するように設定すれば


値渡しになるんだね😊


このとき


void newmadefunction(int x){


x=x*2;

printf("%d\n",x);

}


の定義を見ても分かるように


newmadefunction(newhairetu[0]);

newmadefunction(newhairetu[1]);

newmadefunction(newhairetu[2]);

newmadefunction(newhairetu[3]);

newmadefunction(newhairetu[4]);


が実行されると


それぞれの命令文の実行ごとに


         変数xが作製され


変数xに


配列newhairetu内の配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


が代入されるようにみえますが


実際には


変数xに

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


に格納されている


           🌞数値データ🌞


1

2

3

4

5


             🌞だけ🌞




が代入されています。



そう


           🌞値渡し🌞



がおこなわれているんです







そして


自作関数の定義の


x=x*2;


が実行されて


変数xに格納されている数値データが2倍にされても


main関数内で作製された配列newhairetuの配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


に格納されている数値データは


1

2

3

4

5

のまま変更されないんだね。」






  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る