• ベストアンサー

Cポインタについて

ある本の中のソースコードをながめていましたら、 (int*)&変数といったコードがありました。 これはどういった処理になっているのでしょうか? ポインタは理解しているつもりだったのですが、 本を調べてもこういう形式のものは記載されていませんでした。 わかりやくす、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

キャストはコンパイラに「データの取得の仕方」を指示するために記述します。 「&変数」では、変数のアドレスを取得するという意味になりますが、この「変数」の宣言型がint型以外だった場合でも、(int *)というキャストを入れることでint型ポインタとして扱えるようになります。 例えばchar型の配列変数a[]があったとします。 これをint型ポインタの変数pに  p=(int*)&a[0]; などとしてやり、以降はp++などを使うことで順次アクセスを高速に行えるようなメリットがあります。(一例です。他にも構造体の先頭アドレスをchar型ポインタに入れてやり、バイト単位での順次アクセスに使ったりします) ただしこのようにポインタ型のキャストを使う場合、アライメントに注意する必要があります。  char型ポインタ→どのアドレスにもアクセス可  short型ポインタ→2の倍数アドレスにのみアクセス可  long型ポインタ→4の倍数アドレスにのみアクセス可 というように、データサイズによってアクセスできるアドレスに制限があります。 従って、char型配列変数をshort型ポインタやlong型ポインタにキャストするように、より大きなサイズのポインタにキャストする場合は正常に動作しない可能性が高くなり危険です。アドレスが明確にわかっている場合など、使用される場面は限定されると思います。

gogogo-n
質問者

お礼

すごくわかりやすく、納得のいく回答をありがとうございます。 ポインタにもキャストがあるんですね。 勉強になりました。 本当にありがとうございました。

その他の回答 (2)

  • nitscape
  • ベストアンサー率30% (275/909)
回答No.3

どのように使われていたのか分からないので違うかもしれませんが、「int*への参照」という可能性もあります。 void aaa(int*& pnData) { pnData++; } main() { int pnOrg[2]; int* pnA; pnOrg[0]=0; pnOrg[1]=1; pnA = pnOrg; printf("before:%d\n",*pnA); aaa(pnA); printf("after;%d\n",*pnA); } before:0 after:1 -------------- 実際に実行したコードではないのであっているかどうかは不明ですが、上のような感じです。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

変数のアドレスを取得して、それをint型のポインタに変換している ??処理ですが、 > 本を調べてもこういう形式のものは記載されていませんでした。 まずはリファレンスとかを読まれてみては。

参考URL:
http://msdn.microsoft.com/library/en-us/vccelng/htm/operator.asp
gogogo-n
質問者

お礼

リファレンスでしらべてみます。 ありがとうございました。

関連するQ&A