• ベストアンサー

p = (char **)*p の意味

C言語を勉強中です。 ネットで以下のような記述の資料がありました。 どういうことなのかわかりません。 ポインタについて理解しているつもりでいましたが、理解してなかったということのでしょうか。。。 なお、pがポインタとして宣言されているか、値として宣言されているかどうかについては記述がありませんでした。 これだけを見て、理解できる方がいれば、教えてもらえると助かります。 ------------------------------------------------------------------------------ レイテンシの算出方法は、以下に示すアドレス更新処理を多数回実行することで行っている。 p = (char **)*p レイテンシ時間=測定時間 / 実行回数 により算出される。 -------------------------------------------------------------------------------

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

これ、ベンチマークテストかなんかのですかね? ・pに(char **)でキャストした内容を代入しているので、 char **pと予測される ・↑だとすると *P はchar *型になる。 ・*pでpのアドレスからポインタ1つ分のデータ読み出す。 ・↑はchar*型なので、char **にキャストしてpに代入する。→pが別のアドレスを示すようになる ・その「別のアドレス」からポインタ1つ分のデータ読み出す ... とpの内容をメモリから「読み出して代入」を繰り返すもののようです。

g47040
質問者

お礼

お礼が遅れてすみません。 おっしゃる通り、ベンチマークテストに関する資料の記載内容です。 丁寧かつ簡潔に説明して頂き、ありがとうございます。 的を得ていて、非常にわかりやすいです。 pの宣言部分については、ご指摘の通り、恐らく、 char **p; と宣言されているのだと思いました。 1つ質問がありまして、もしお時間おありでしたらご回答頂けると助かります。 質問内容は、p=(char**)*pをループ内で書くと、コンパイラの最適化機能によって、この処理が省かれてしまう可能性があるのではないか、ということです。 このままだと、pの値が変わらない気がします。 もしループさせる場合、インクリメント等によってpを更新する必要はあるでしょうか? よろしくお願いします。

その他の回答 (1)

回答No.2

>1つ質問がありまして、もしお時間おありでしたらご回答頂けると助かります。 >質問内容は、p=(char**)*pをループ内で書くと、コンパイラの最適化機能によって、この処理が省かれてしまう可能性があるのではないか、ということです。 最適化される可能性は皆無です。 なぜなら「実行してみるまで、*pの値が判らない」からです。 p=(char **)*p; は「pが指すアドレスのメモリからデータを取り出し、そのデータを新しいpの値とする」ので、pの値は「実行するたびに、何になるか判らない」です。 場合によっては「pが指すアドレスに読み出し可能なメモリがなく、メモリアクセス例外が発生するかも知れない」ですが、このベンチマークは「そんな事が起きるとは想定してない」と思います。

g47040
質問者

お礼

なるほどです。 よくわかりました。 貴重なお時間をご回答いただき、ありがとうございました。 どちらをベストアンサーにするか、非常に悩みます…

関連するQ&A