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

ソーラー「


それではもうすこしだけ


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


int hairetu[]



ポインタ変数newhairetuを参照渡ししたら


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


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



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


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[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+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を実行すると


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内には


配列変数


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 hairetu[]に(よって生成されるポインタ変数hairetuに)


ポインタ変数newhairetuを代入すると


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


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


hairetu

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]


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


自作関数の操作


*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[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出力表示されます


つまり


このプログラムでは


自作関数の引数である配列宣言


int hairetu[]


の実行に伴って


同時に自動的に


作製された


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


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


が代入されることにより



つまり          


            🍎ポインタ渡し🍎



が行われることにより


main関数内で定義された


配列newhairetuの中の配列変数


newhairetu[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


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


1

2

3

4

5



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


*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[0]

newhairetu[1]

newhairetu[2]

newhairetu[3]

newhairetu[4]


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


1

2

3

4

5

から


10



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


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


自作関数の引数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)

に等しくなります。




自作関数の定義が


*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]



格納している数値は


自作関数の操作を受けて


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;


}


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


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


#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のアドレスを格納している自作関数の引数となっている


ポインタ変数hairetu


に代入されると



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


の引数に記述されている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]


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


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


できるようになります。


つまり


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


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


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


newmadefunction(newhairetu);


が実行された場合


自作関数の定義


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の引数となっているポインタ変数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+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[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;

}

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


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;


}



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


ソーラー「ちゃんと


自作関数の定義が


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)

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


てきとうに


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


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


そして


そのてきとうに


記述された


自作関数の定義は


文法的に


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


             solarplexussより


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

作者を応援しよう!

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

応援したユーザー

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