コピー2009.10.26スポンサーリンク目次はじめにポインタ型のアドレスの不思議アドレスは数値型?ポインタ型への加減算についてポインタ型での禁則事項まとめオマケはじめに前々から、C言語のポインタで不思議だったこと。単項&演算子をアドレス演算子といい,&の後に続くオペランドのポインタ(アドレス)を表します。;解説&aはaのアドレスを表し,ポインタpにaのアドレスを代入する式です。http://www.imit.chiba-u.ac.jp/new-system/sr/man_hitachi_c/MAN/3000/03C3100D/C310057.HTM上記の解説を見て、アドレス演算子をつければ、その変数のアドレスが分かる。アドレスは数字だと、そのまま理解すると少し不思議なことが起きます。ポインタ型のアドレスの不思議アドレスは数値型?例えば、以下のような計算をしたとします。結果はどうなると思いますか。%d\n",x,y);}実は、xとyが同じ値になりません!この理由についてC言語が得意な友人に色々教えていただきました。その結果、「数値とアドレスは違うもの。&をつけるとポインタ型になる。」ということが分かりました。ポインタ型というものは、数値のようだがアドレスとしての計算を行うので、ポインタ型に加算や減算を行うと、通常の数値型としての計算にあてはまらないようなのです。ポインタ型への加減算について以下のようにポインタ型+通常の数値の加算は可能です。n;この計算式は、内部的には以下のように自動でsizeof(X)を数値に掛け算した値と同じになります。ポインタ型での加減算は注意しないとおかしな計算をしていることになるので注意が必要です。n;ポインタ型での禁則事項ポインタ型同士の加算を行うとエラーが発生します。アドレス同士で加算すること自体が通常行わない演算のためだと思われます。他に注意する点としては、ポインタ型同士の加算の他に、ポインタ型に数値の掛算・割算はエラーもおきます。1;}まとめ教科書や解説サイトとかで、ポインタ型のアドレスを%pではなく整数型を表示させる%dで表示するように紹介することが多いため、「アドレスと整数は同じなんだ。アドレスって数値だし納得!」みたいな錯覚すると上記のような混乱を起こす可能性があります。つっこんだところまで解説していて分かりやすいです。オマケ話は全く変わるのですが、友人が書いたサンプルが以下にあります。{0,100};printf("%d\n",x[y]);}この書き方には驚きました。対応しているから、こういう書き方できるそうです。C言語は奥が深いです。教えてくださって、ありがとうございます。_)mこれらのことが分かると、次のようなネタコードが書けますので紹介します。ビットシフト無しで1バイトずつ取り出す。0×11223344;for(i=0;i(すみません。ブログの仕様変更で消えてしまった!)加算のみで5の倍数を表示する。仕様スポンサーリンクプロフィールなたで明るくて楽しいことが好きです。みなさん、こんにちは。書式変換の一部にstrfを使用しており、これがエラーの原因になってました。今日はWindowsXPでの16ビット色を、手探りで調べてみた。疲れたけど、きっと誰かの役に立つはず。いうか16ビットの環境での、レイヤード透過色指定に使いたかった。これが、良く調べたらまずかったかもしれない。[...]アルゴリズムFizz-Buzz問題を解いてみた!今日はネットでFizz-Buzz問題という面白そうなものを見つけた。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。目次はじめにポインタ型のアドレスの不思議アドレスは数値型?ポインタ型への加減算についてポインタ型での禁則事項まとめオマケタイトルとURLをコピーしました。