答えは、ポインタ変数pを使って、変数bという名前のついたメモリアドレスに”2′′を代入したからです。変数とは結局のところ、メモリアドレスに名前がついているだけなんです。メモリアドレスを別の方法で特定することができれば、C言語は好きなアドレスを書き換えることができます。今回の例では、「変数b」はメモリ上で「0x7fffffffe48c」というアドレスに割り当てられています。「0x7fffffffe48c」のアドレスのメモリを書き換えれば、変数bの値を書き換えたのと同じことになります。...まぁ、ふつうはプログラミングの段階で変数に割り当てられるメモリのアドレスを把握するのはムリなので、以下のように書くのが自然です。b;}ポインタとはポインタは、「メモリ上の他のアドレスを指す変数」です。アドレスと言ってもしょせんは数値です。数値なので、アドレスそのものをメモリに代入することができます。何をいっているかわかりにくいでしょうか?でも、さっき書いたコードがそのままの意味です。0x7fffffffe48c;メモリには数値が代入できます。メモリのアドレスも数値です。メモリには他の変数のアドレスを代入できます。この仕組みは便利なので、C言語はアドレスを指すための変数(ポインタ)を特別扱いします。“int*p”のように宣言するときに*をつければ、それはポインタ変数になります。&b”のように&をつければ、ほかの変数のアドレスを参照することができます。2′′のように*をつければ、ポインタ変数の指すアドレスの中身を参照/更新することができます。1と3で同じ”*”という記号を使っているくせにイミが違うのは少しヒドいんですが、まぁ、そこは慣れるしかないところです。ポインタという仕組みがあるのかそれは皆さんで考えてほしいところです。ポインタというのは用意された仕組みであって、それをどう使うかはプログラマーの自由であるからです。ここでは主な用途を軽くだけ説明しておきます。1つの関数で複数の値を返すC言語は、関数の返り値が一つしかありません。そのため、2つ以上の値を返却したい場合に、ポインタを利用して値を返すことになります。2になる}サイズの大きな変数を効率よく扱うC言語は、関数の引数として値を渡す際に、「引数用のアドレス」に変数をコピーします。int型やchar型のような小さい変数であれば問題ないですが、大きなサイズの構造体を引数に取るような関数の場合、メモリコピーにCPUを使ってしまって性能が落ちてしまいます。どれだけ大きな構造体でも、先頭のアドレスだけ渡してしまえば効率よくやり取りできます。変数として名前のついていないメモリを確保して、そこを操作するC言語は基本的に、変数はすべて事前にサイズを決めて宣言しておきます。ファイルを読み込む際など、必要なサイズがあらかじめ分からないことがあります。そんなときmallocコールなどで動的にメモリを確保することになりますが、動的に確保したメモリには名前がついていません。そこで、事前にポインタ変数だけは用意しておいて、あとで動的に確保したメモリをポインタ変数を経由して参照する、ということをします。おわりにプログラミング言語はどんどん進歩し、ポインタを必要としない言語が多くなってきています。純粋なC言語を必要とする場面は極めて少なく、ポインタを理解しなければならない場面はほとんどなくなってきました。ポインタという考え方が消えたわけではなく、どの言語にもその根底としてポインタの概念が存在し、「プログラマーにポインタを意識させないようにする」努力をしています。ポインタを理解することで、ポインタの無い言語においてもより微細なプログラミングが可能となるでしょう。そのためにはポインタをあやふやな理解で留めず、コンピュータのアーキテクチャから真に理解することが必要だと思います。本記事が読者の理解の一助となれば幸いです。AM参照されるのはアドレス+型なんだから、ポインターは、実体の参照。例えが必要になっちゃうけど、実体名を呼んで召喚魔法的な話にしてあげてくれると嬉しい。AM素晴らしい記事だと思います。言って全部は分からないのですが、最後の三行に深く感銘を受けます。覚えて使えばいいんだよ!」とか言うやつが大嫌いです。意味不明な迄に長ったらしい関数とか、どう動いてるか全く知らないクエリ使いをバイナリでどんどん撲殺して欲しいです。...分かんないんですけどね。PM>じゃあ「0x7fffffffe494」が「変数c」だと誰が決めたんでしょうか。>(中略)>正解はコンパイラです。バイナリ実行時にOSが決めるわけではないんですね。有益な情報ありがとうございました。PMこれ、自分も実行時にOSが決めていると思っていました。コンパイル時と実行時でメモリの状態が一致しているとは限らないので。変数の場所が決まります。auto変数は実際にはスタック上に取られることが多いです。スタックの領域はOSが決めることが多いですがリンカが決めたりランタイムの初期化コードが決めたりすることもあります。AM言及記事を書きました。よろしければ読んでみてください。前回、C言語のポインタに関する解説記事を書きまして、そこそこの反響を貰うとともにいくつかの指摘を受けました。前回の記事では幾つか「ウソではないけど真実と違う」記述がありまして、その点を補足としていくつか説明します。今回、初学者向けではなく中級者以降の人でないとナンノコッチャ度が高いのでお付き合いください。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。前回、C言語のポインタに関する解説記事を書きまして、そこそこの反響を貰うとともにいくつかの指摘を受けました。...GeoJSONで市町村境界をマージして都道府県境界にしたい(その2)GeoJSONのPolygonをマージしたい第2回です。前回、純粋な多角形の統合ではなくて、領域が被らない多角形の統合になるのでグラフ問題として解くことができるという説明をしました。それは誰もが抱く夢です。3Dモデルだってパンチラしたくないと思っているハズです。いうわけで偉大なる先人がいます。...国土地理院の地図データをUnityで読みたい(願望)なんかgoogleのAdSense通ったんで有益な情報載せないとなって。最初に学ぶべきプログラミング言語ってなんだと思いますか?そうです。