天国にいけるC言語入門 ヘキサ構造体 ver5.2130
自作関数の引数としてhairetuの配列宣言またはhairetuのポインタ変数宣言が行われた場合*hairetuとhairetu[0]、*hairetu+1とhairetu[1]・・・は等しくなります
自作関数の引数として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
から
6
7
8
9
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のアドレスを格納している
配列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より
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます