RoboCup Junior Japan Rescue Kanto OB
2005~2013
2005~2013
今回はポインタの続きです。
前回までで、ポインタと変数の関係についてつらつらと書いていったかと思います。
今回の記事ではここら辺を実際のプログラムを使ってもう一度書いていこうと思います。
と、いう訳で早速プログラムです。
int main(void)
{
int x=5;
int y=2;
int *p;
printf("%d",x);
printf("%p",&x);
p=&x;
printf("%d",*p);
printf("%p",p);
p=&y;
printf("%d",*p);
printf("%p",p);
return 0;
}
例えばこんなプログラムがあったとしましょう。
まず一番目のprintfでは、xの値である5が出力されるのは大丈夫ですね。
じゃあ二番目のprintfは何でしょう。
二番目のprintfは変数xのアドレスになりますので、
わかりません(笑)
変数のアドレスがどうなるかは、その時のメモリーの空き具合によって変わりますので、
プログラムを実行する度に変わってきてくるのです。
因みにアドレスを出力する際には%pを使います。
そして三番目のprintf、ここでは前にpにxのアドレスを代入していることから、これはxの値である5が出力されます。
同様に四番目のprintfは・・・xのアドレスなので此方も不明ですね。
まぁ、二番目のprintfの結果と同じ値が出力されることになります。
そして五番目、ここでは、既にpに新たな変数yのアドレスが代入されていますね。
ということは、ここで出力されるのは、yの値である2になる訳です。
同様に六番目のprintfは変数yのアドレスになります。これもxと同様に数値そのものはわかりませんが、
xのアドレスとyのアドレスが一致することはありませんので、二番目、四番目の値とは異なる値になるはずです。
また、こんなプログラムになると出力はどうなるでしょう。
int main(void)
{
int x=5;
int y=2;
int *p;
p=&x;
*p+=y;
printf("%d",*p);
printf("%d",x);
return 0;
}
このプログラムの場合、まずはポインタpに変数xのアドレスを代入しています。
そしてさらに、そのポインタpの示す値に変数yの値を加えています。
ということなので、一番目のprintfが出力するのは5+2なので7となります。
二番目はと言いますと、pにはxのアドレスがありますので、pがxのアドレスと一致している間は必ず
*p=xとなります。
よって二番目の出力も7ということになります。
こんな感じで、片方が変わればもう片方も変わる。
こういった同期する仕様になっているので、ちゃんと使えば非常に便利ですが、
やっぱり値の変動とか、そもそも今どのポインタがどの変数を示しているのか等、
一目ではわかりにくい部分がどうしても出てきてしまいます。
だから難しい、だからわからない。こうなる訳です。
まぁこれに関しては、正直慣れが一番の特効薬ではないでしょうか。
最初のうちはわかりません。常識です。でもやっていればそのうち慣れてくると思います。
さて、ここまできて一つ疑問に思うのが、「これ、何に使うんだ?」というところでしょう。
だって変数のアドレスがわかったって・・・ん?
ってなりますよね。
実はこのポインタ、例えば関数とか、配列とか、文字列とか、構造体とか、
そこら辺と兼ね合わせて使うことが殆どになります。
まぁこれらの話は後程するとして、まずは先程ちょろっと出てきた文字列や構造体について紹介していこうと思います。
まぁそんなところで今日は終了です。
(^・ω・)ノ RadiumProduction in RoboCup Junior
前回までで、ポインタと変数の関係についてつらつらと書いていったかと思います。
今回の記事ではここら辺を実際のプログラムを使ってもう一度書いていこうと思います。
と、いう訳で早速プログラムです。
int main(void)
{
int x=5;
int y=2;
int *p;
printf("%d",x);
printf("%p",&x);
p=&x;
printf("%d",*p);
printf("%p",p);
p=&y;
printf("%d",*p);
printf("%p",p);
return 0;
}
例えばこんなプログラムがあったとしましょう。
まず一番目のprintfでは、xの値である5が出力されるのは大丈夫ですね。
じゃあ二番目のprintfは何でしょう。
二番目のprintfは変数xのアドレスになりますので、
わかりません(笑)
変数のアドレスがどうなるかは、その時のメモリーの空き具合によって変わりますので、
プログラムを実行する度に変わってきてくるのです。
因みにアドレスを出力する際には%pを使います。
そして三番目のprintf、ここでは前にpにxのアドレスを代入していることから、これはxの値である5が出力されます。
同様に四番目のprintfは・・・xのアドレスなので此方も不明ですね。
まぁ、二番目のprintfの結果と同じ値が出力されることになります。
そして五番目、ここでは、既にpに新たな変数yのアドレスが代入されていますね。
ということは、ここで出力されるのは、yの値である2になる訳です。
同様に六番目のprintfは変数yのアドレスになります。これもxと同様に数値そのものはわかりませんが、
xのアドレスとyのアドレスが一致することはありませんので、二番目、四番目の値とは異なる値になるはずです。
また、こんなプログラムになると出力はどうなるでしょう。
int main(void)
{
int x=5;
int y=2;
int *p;
p=&x;
*p+=y;
printf("%d",*p);
printf("%d",x);
return 0;
}
このプログラムの場合、まずはポインタpに変数xのアドレスを代入しています。
そしてさらに、そのポインタpの示す値に変数yの値を加えています。
ということなので、一番目のprintfが出力するのは5+2なので7となります。
二番目はと言いますと、pにはxのアドレスがありますので、pがxのアドレスと一致している間は必ず
*p=xとなります。
よって二番目の出力も7ということになります。
こんな感じで、片方が変わればもう片方も変わる。
こういった同期する仕様になっているので、ちゃんと使えば非常に便利ですが、
やっぱり値の変動とか、そもそも今どのポインタがどの変数を示しているのか等、
一目ではわかりにくい部分がどうしても出てきてしまいます。
だから難しい、だからわからない。こうなる訳です。
まぁこれに関しては、正直慣れが一番の特効薬ではないでしょうか。
最初のうちはわかりません。常識です。でもやっていればそのうち慣れてくると思います。
さて、ここまできて一つ疑問に思うのが、「これ、何に使うんだ?」というところでしょう。
だって変数のアドレスがわかったって・・・ん?
ってなりますよね。
実はこのポインタ、例えば関数とか、配列とか、文字列とか、構造体とか、
そこら辺と兼ね合わせて使うことが殆どになります。
まぁこれらの話は後程するとして、まずは先程ちょろっと出てきた文字列や構造体について紹介していこうと思います。
まぁそんなところで今日は終了です。
(^・ω・)ノ RadiumProduction in RoboCup Junior
カレンダー
最新CM
カテゴリー
らじぷろ目次
らじぷろ検索機
最新記事
(01/01)
(01/03)
(08/27)
(04/29)
(01/01)
(11/20)
(09/06)
(09/04)
(08/09)
(08/06)
(07/27)
(05/29)
(03/15)
(01/01)
(05/07)
プロフィール
HN:
Luz
性別:
男性
アーカイブ