自作関数の引数としてhairetuの配列宣言またはhairetuのポインタ変数宣言が行われた場合*hairetuとhairetu[0]、*hairetu+1とhairetu[1]・・・は等しくなります

ソーラー「


それではもうすこしだけ


自作関数newmadefunctionの引数となっている


int hairetu[](ポインタ変数hairetu)



main関数内で


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


と配列宣言された配列newhairetuのアドレスを格納しているポインタ変数newhairetu

を参照渡しして


自作関数newmadefunctionを実行することにより


main関数内で


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


と配列宣言された配列newhairetuの配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


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


1

2

3

4

5



自作関数newmadefunctionの操作を受けて変化する様子をみてみようか。



main関数内で配列宣言された配列newhairetuの配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


に格納されている数値データに5を加える


自作関数newmadefunctionを次の命令文のように

👇

void newmadefunction(int hairetu[]){


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;


}


定義し→」



🐣  🐣  🐣


ここで


*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)



それぞれ


hairetu[0]がアクセスしているアドレスの場所のメモリに格納されている数値データ

hairetu[1]がアクセスしているアドレスの場所のメモリに格納されている数値データ

hairetu[2]がアクセスしているアドレスの場所のメモリに格納されている数値データ

hairetu[3]がアクセスしているアドレスの場所のメモリに格納されている数値データ

hairetu[4]がアクセスしているアドレスの場所のメモリに格納されている数値データ


すなわち


hairetu[0]に格納されている数値データ

hairetu[1]に格納されている数値データ

hairetu[2]に格納されている数値データ

hairetu[3]に格納されている数値データ

hairetu[4]に格納されている数値データ



をあらわしており



*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;


が実行されると



hairetu[0]がアクセスしているアドレスの場所のメモリに格納されている数値データ

hairetu[1]がアクセスしているアドレスの場所のメモリに格納されている数値データ

hairetu[2]がアクセスしているアドレスの場所のメモリに格納されている数値データ

hairetu[3]がアクセスしているアドレスの場所のメモリに格納されている数値データ

hairetu[4]がアクセスしているアドレスの場所のメモリに格納されている数値データ

に5が加えられます。


🐤  🐤  🐤


「→


main関数内で配列宣言された


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


newhairetuを


自作関数newmadefunction(int hairetu[])の


引数であるint hairetu[] に以下のように代入して~ぇ

👇

newmadefunction(newhairetu)


その状態で


自作関数newmadefunction


newmadefunction(newhairetu);



を実行すると


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


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


に5は加えられるのでしょうか?


プログラムを構成し


コンパイルしてみます。


どうなるかな?」



#include <stdio.h>


void newmadefunction(int hairetu[]){


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;


}


int main (void){


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


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]);


newmadefunction(newhairetu);


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;

}


コンパイル結果


1

2

3

4

5

6

7

8

9

10


ソーラー


「それではっ😊


このプログラムの流れをもう1回詳しく見ていきます😊


main関数内でint newhairetu[5]={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


と数値データが格納されています


自作関数newmadefunctionの引数である


int hairetu[]に(よって生成されるポインタ変数hairetuに)


配列newhairetuのアドレスを格納しているポインタ変数newhairetuを代入すると


hairetu

hairetu+1

hairetu+2

hairetu+3

hairetu+4



newhairetu

newhairetu+1

newhairetu+2

newhairetu+3

newhairetu+4


が代入されることになります


newhairetu

newhairetu+1

newhairetu+2

newhairetu+3

newhairetu+4



newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


のアドレスを格納しているポインタ変数なので


hairetu

hairetu+1

hairetu+2

hairetu+3

hairetu+4


というポインタ変数には


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


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


すると


*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)



newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


そのものをあらわすことになります



*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)



newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


のアドレスのメモリに格納されている数値データをあらわすことになります


ですので


自作関数の操作


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;


を加えると


newhairetu[0]=newhairetu[0]+5;

newhairetu[1]=newhairetu[1]+5;

newhairetu[2]=newhairetu[2]+5;

newhairetu[3]=newhairetu[3]+5;

newhairetu[4]=newhairetu[4]+5;


が実行されることになり



newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


に格納されている数値データに5が加えられます


すなわち


main関数内で定義された配列newhairetuの配列変数に格納されている数値データ


1

2

3

4

5



自作関数newmadefunctionの操作をうけて


6

7

8

9

10

変更されます


その結果


コンパイル結果


1

2

3

4

5

6

7

8

9

10


がprintf出力表示されます


つまり


このプログラムでは


自作関数newmadefunctionの引数となっている配列宣言


int hairetu[]



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


が代入されているので


つまり          


            🍎参照渡し(ポインタ渡し)🍎



が行われているので


いいかえると


int hairetu[]


と同時に生成されることになる


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


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


が代入されているので


自作関数

newmadefunction(newhairetu);

が実行されると


main関数内で定義された


配列newhairetuの配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


のアクセスしているメモリに格納されている数値データ


1

2

3

4

5



5を足すという自作関数newmadefunctionの操作

👇

*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;


いまでは


hairetu

hairetu+1

hairetu+2

hairetu+3

hairetu+4

には

newhairetu

newhairetu+1

newhairetu+2

newhairetu+3

newhairetu+4

代入されているので


👇

*newhairetu=*newhairetu+5;

*(newhairetu+1)=*(newhairetu+1)+5;

*(newhairetu+2)=*(newhairetu+2)+5;

*(newhairetu+3)=*(newhairetu+3)+5;

*(newhairetu+4)=*(newhairetu+4)+5;


が実行されます


*newhairetu

*(newhairetu+1)

*(newhairetu+2)

*(newhairetu+3)

*(newhairetu+4)

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]

をあらわすので


newhairetu[0]=newhairetu[0]+5;

newhairetu[1]=newhairetu[1]+5;

newhairetu[2]=newhairetu[2]+5;

newhairetu[3]=newhairetu[3]+5;

newhairetu[4]=newhairetu[4]+5;


が実行されることになり


配列newhairetuの中の配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


のアクセスしているメモリに格納されている数値データは


1

2

3

4

5

から


10



変更されているのですね。   


このプログラムの例のように


自作関数newmadefunctionの引数int hairetu[]に


main関数で定義された配列newhairetuのアドレスを格納している


ポインタ変数


newhairetu


を渡す場合


実は


int hairetu[]によって同時に生成される


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


main関数内で配列宣言された配列newhairetuのアドレスを格納している

ポインタ変数


newhairetu


を渡す


ということがおこなわれています。



ポインタ変数にアドレス(アドレスを格納したポインタ変数)を渡すという



          🍓参照渡し(ポインタ渡し)🍓



がおこなわれているのですね。



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


配列newhairetuのデータを


自作関数の引数(int hairetu[])に渡す方法がないのです


=(イコール)


自作関数の引数となっているポインタ変数hairetuに渡す方法がないのです


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


配列hairetuのアドレスを格納しているポインタ変数hairetuに参照渡しされると


*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)



*newhairetu

*(newhairetu+1)

*(newhairetu+2)

*(newhairetu+3)

*(newhairetu+4)


に等しくなります。


さらに

*newhairetu

*(newhairetu+1)

*(newhairetu+2)

*(newhairetu+3)

*(newhairetu+4)

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


の格納している数値データをあらわしています。


*newhairetu

*(newhairetu+1)

*(newhairetu+2)

*(newhairetu+3)

*(newhairetu+4)

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]

は等しいのですね。


となると


結局

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]

*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)

に等しくなります。




自作関数newmadefunctionの定義に


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;


のように

newhairetu[0]と等しくなる*hairetu

newhairetu[1]と等しくなる*(hairetu+1)

newhairetu[2]と等しくなる*(hairetu+2)

newhairetu[3]と等しくなる*(hairetu+3)

newhairetu[4]と等しくなる*(hairetu+4)


が使用されていると


newhairetu[0]=newhairetu[0]+5;

newhairetu[1]=newhairetu[1]+5;

newhairetu[2]=newhairetu[2]+5;

newhairetu[3]=newhairetu[3]+5;

newhairetu[4]=newhairetu[4]+5;


がおこなわれることになり


main関数内で配列宣言された配列newhairetuの


配列変数

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]



格納している数値データは


自作関数newmadefunctionの操作を受けて


5が加えられることになるんです」


ソーラー「そして


今までのエピソードで


   🌞  🌞  🌞  予告  🌞  🌞  🌞



としてしめされたように


自作関数の定義を


void newmadefunction(int hairetu[]){


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;


}


から


void newmadefunction(int hairetu[]){


hairetu[0]=hairetu[0]+5;

hairetu[1]=hairetu[1]+5;

hairetu[2]=hairetu[2]+5;

hairetu[3]=hairetu[3]+5;

hairetu[4]=hairetu[4]+5;


}


と書き換えることもできます。


自作関数newmadefunctionの定義をかきかえたプログラムは次のようになります。

👇

#include <stdio.h>


void newmadefunction(int hairetu[]){


hairetu[0]=hairetu[0]+5;

hairetu[1]=hairetu[1]+5;

hairetu[2]=hairetu[2]+5;

hairetu[3]=hairetu[3]+5;

hairetu[4]=hairetu[4]+5;


}


int main (void){


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


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]);


newmadefunction(newhairetu);


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;

}


コンパイル結果

(EAZY IDECの場合)

(Visual Studioの場合)

1

2

3

4

5

6

7

8

9

10


ソーラー「



void newmadefunction(int hairetu[]){


hairetu[0]=hairetu[0]+5;

hairetu[1]=hairetu[1]+5;

hairetu[2]=hairetu[2]+5;

hairetu[3]=hairetu[3]+5;

hairetu[4]=hairetu[4]+5;


}


と記述されていても


void newmadefunction(int hairetu[]){


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;


}


が記述されているのと


かわりがありませんね。


ここで以前のエピソードで



      🌞 🌞 🌞予告🌞 🌞 🌞          


なぜ このように表記が変更できるのかは


後のエピソードで語られることになります。



      🌞 🌞 🌞予告🌞 🌞 🌞  


となっていましたが


やっときました。


もう、みなさんは


なぜこのようなことができるのか


わかっているんじゃないかな?


ここで


なぜそうなっているのか


考察をくわえてみよっかな アレサ」


アレサ「はい、ソーラーさん」        


ソーラー「


hairetuの配列宣言


によって


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


が作製されると同時に


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


のアクセスしているメモリのアドレスを格納しているポインタ変数


hairetu

hairetu+1

hairetu+2

hairetu+3

hairetu+4


も作製されています。



配列hairetuの

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


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


hairetu

hairetu+1

hairetu+2

hairetu+3

hairetu+4


格納しているアドレスのメモリにアクセスし


そのメモリに格納されている数値データを表すように設定されています。


そして


*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)


ポインタ変数

hairetu

hairetu+1

hairetu+2

hairetu+3

hairetu+4


が格納しているアドレスのメモリに


格納されている数値データを表すことになります。


すなわち


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)


は同じアドレスのメモリに格納されている数値データ


を表すことになるので


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)


はまったく同じものをあらわすことになります。


ですので


自作関数の定義を


void newmadefunction(int hairetu[]){


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;


から


void newmadefunction(int hairetu[]){


hairetu[0]=hairetu[0]+5;

hairetu[1]=hairetu[1]+5;

hairetu[2]=hairetu[2]+5;

hairetu[3]=hairetu[3]+5;

hairetu[4]=hairetu[4]+5;


}


と書き換えることができます。


ここで


main関数内で配列宣言された配列newhairetuのアドレスを格納している


ポインタ変数newhairetuが🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓



配列hairetuのアドレスを格納している自作関数newmadefunctionの引数となっている


ポインタ変数hairetu


に代入されると



(配列hairetuのアドレスを格納しているポインタ変数hairetuは自作関数newmadefunction

の引数に記述されているint hairetu[]によって作製されています。)



配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]



ポインタ変数newhairetuが格納している


配列newhairetuのアドレスのメモリにアクセスすることになります。


つまり


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]



配列変数

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


がアクセスしているメモリにアクセスするようになり


そのメモリに格納されている数値データを変更することが


できるようになります。


つまり


自作関数newmadefunctionの引数となっているポインタ変数に


main関数内で作製された配列newhairetuのアドレスを格納している


ポインタ変数newhairetuが代入されて


newmadefunction(newhairetu);


が実行された場合


自作関数newmadefunctionの定義


void newmadefunction(int hairetu[]){


hairetu[0]=hairetu[0]+5;

hairetu[1]=hairetu[1]+5;

hairetu[2]=hairetu[2]+5;

hairetu[3]=hairetu[3]+5;

hairetu[4]=hairetu[4]+5;


}

hairetu[0]=hairetu[0]+5;

hairetu[1]=hairetu[1]+5;

hairetu[2]=hairetu[2]+5;

hairetu[3]=hairetu[3]+5;

hairetu[4]=hairetu[4]+5;


が実行されることによって


newhairetu[0]=newhairetu[0]+5;

newhairetu[1]=newhairetu[1]+5;

newhairetu[2]=newhairetu[2]+5;

newhairetu[3]=newhairetu[3]+5;

newhairetu[4]=newhairetu[4]+5;


が実行されることになり


配列変数

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


のアクセスしているメモリの値に5を加えることができるように


なるというわけです。



このとき

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)

全く同じものを表しているので


自作関数の定義は


void newmadefunction(int hairetu[]){


hairetu[0]=hairetu[0]+5;

hairetu[1]=hairetu[1]+5;

hairetu[2]=hairetu[2]+5;

hairetu[3]=hairetu[3]+5;

hairetu[4]=hairetu[4]+5;


}


から


void newmadefunction(int hairetu[]){


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;

}

とかきかえることができます。


このとき


自作関数newmadefunctionの引数となっているint hairetu[](ポインタ変数hairetu)に


配列newhairetuのアドレスを格納している


ポインタ変数newhairetuが代入されて


newmadefunction(newhairetu);


が実行された場合


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


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


代入されています。


ですので

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

のアクセスしているメモリのアドレスを格納しているポインタ変数


hairetu

hairetu+1

hairetu+2

hairetu+3

hairetu+4


配列変数

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]

のアクセスしているメモリのアドレスを格納しているポインタ変数


newhairetu

newhairetu+1

newhairetu+2

newhairetu+3

newhairetu+4


が代入されていることになります。


そして


自作関数の定義


void newmadefunction(int hairetu[]){


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;

}


に記述されている


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;


が実行されることになるのですが



*newhairetu=*newhairetu+5;

*(newhairetu+1)=*(newhairetu+1)+5;

*(newhairetu+2)=*(newhairetu+2)+5;

*(newhairetu+3)=*(newhairetu+3)+5;

*(newhairetu+4)=*(newhairetu+4)+5;


が実行されることに等しくなります。


その結果


*newhairetu

*(newhairetu+1)

*(newhairetu+2)

*(newhairetu+3)

*(newhairetu+4)


ポインタ変数


newhairetu

newhairetu+1

newhairetu+2

newhairetu+3

newhairetu+4


が格納しているアドレスのメモリに格納されている数値データを表すので


*newhairetu=*newhairetu+5;

*(newhairetu+1)=*(newhairetu+1)+5;

*(newhairetu+2)=*(newhairetu+2)+5;

*(newhairetu+3)=*(newhairetu+3)+5;

*(newhairetu+4)=*(newhairetu+4)+5;



が実行されると


ポインタ変数

newhairetu

newhairetu+1

newhairetu+2

newhairetu+3

newhairetu+4


が格納しているアドレスのメモリに格納されている数値データに5が


加えられることになります。


つまり


配列変数

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]

ポインタ変数

newhairetu

newhairetu+1

newhairetu+2

newhairetu+3

newhairetu+4


が格納しているアドレスのメモリにアクセスして


そのメモリに格納されている数値データをあらわすので


*newhairetu=*newhairetu+5;

*(newhairetu+1)=*(newhairetu+1)+5;

*(newhairetu+2)=*(newhairetu+2)+5;

*(newhairetu+3)=*(newhairetu+3)+5;

*(newhairetu+4)=*(newhairetu+4)+5;



が実行されると


newhairetu[0]=newhairetu[0]+5;

newhairetu[1]=newhairetu[1]+5;

newhairetu[2]=newhairetu[2]+5;

newhairetu[3]=newhairetu[3]+5;

newhairetu[4]=newhairetu[4]+5;


が実行され


配列変数

newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


の格納している数値データに5が加えられることになります。




         😊  おまけ  😊



hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)

全く同じものを表しているので


自作関数newmadefunctionの定義は


void newmadefunction(int hairetu[]){


hairetu[0]=hairetu[0]+5;

hairetu[1]=hairetu[1]+5;

hairetu[2]=hairetu[2]+5;

hairetu[3]=hairetu[3]+5;

hairetu[4]=hairetu[4]+5;


}


から


void newmadefunction(int hairetu[]){


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;

}

とかきかえることができましたね。


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)

全く同じものを表しているので


自作関数newmadefunctionの定義はさらに


void newmadefunction(int hairetu[]){


*hairetu=hairetu[0]+5;

hairetu[1]=*(hairetu+1)+5;

*(hairetu+2)=hairetu[2]+5;

*(hairetu+3)=hairetu[3]+5;

hairetu[4]=hairetu[4]+5;


}



hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)


がまぜこぜになったものにかきかえることもできます。


実際に

この自作関数の定義


void newmadefunction(int hairetu[]){


*hairetu=hairetu[0]+5;

hairetu[1]=*(hairetu+1)+5;

*(hairetu+2)=hairetu[2]+5;

*(hairetu+3)=hairetu[3]+5;

hairetu[4]=hairetu[4]+5;


}

を用いたプログラムを実行してみましょう。


#include <stdio.h>


void newmadefunction(int hairetu[]) {


*hairetu = hairetu[0] + 5;

hairetu[1] = *(hairetu + 1) + 5;

*(hairetu + 2) = hairetu[2] + 5;

*(hairetu + 3) = hairetu[3] + 5;

hairetu[4] = hairetu[4] + 5;


}


int main(void) {


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


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]);


newmadefunction(newhairetu);


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;

}


コンパイル結果


EAZY IDECの場合

1

2

3

4

5

6

7

8

9

10


Visual Studioの場合

1

2

3

4

5

6

7

8

9

10


ソーラー「ちゃんと


自作関数newmadefunctionの定義が


void newmadefunction(int hairetu[]){


hairetu[0]=hairetu[0]+5;

hairetu[1]=hairetu[1]+5;

hairetu[2]=hairetu[2]+5;

hairetu[3]=hairetu[3]+5;

hairetu[4]=hairetu[4]+5;


}



void newmadefunction(int hairetu[]){


*hairetu=*hairetu+5;

*(hairetu+1)=*(hairetu+1)+5;

*(hairetu+2)=*(hairetu+2)+5;

*(hairetu+3)=*(hairetu+3)+5;

*(hairetu+4)=*(hairetu+4)+5;

}

となっているときと


同じコンパイル結果がでてきましたね。


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

*hairetu

*(hairetu+1)

*(hairetu+2)

*(hairetu+3)

*(hairetu+4)

全く同じものを表しているので


てきとうに


自作関数newmadefunctionの定義を記述しても


うまくコンパイルできてしまうというわけです。(笑)


そして


そのてきとうに


記述された


自作関数newmadefunctionの定義は


文法的に


まちがっているわけではありません。


             solarplexussより


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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