• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字列が格納されているポインタからの取出し)

ポインタから文字列を取り出す際の注意点とは?

このQ&Aのポイント
  • ポインタから文字列を取り出す際、1文字ずつ取り出す必要があります。
  • 取り出した文字列は16進表記で表示されます。
  • 質問文章の操作において、予想と結果が異なった理由として、3の段階で1文字しか取り出さなかったためです。

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

ポインター cPtr が4バイトの領域を指している、ということは間違いないのですか? だとすれば、C言語の構文上、 *cPtr == *(cPtr + 0) == cPtr[0] ですから、 *cPtr と書くことで、cPtr が指している領域の先頭にアクセスできます。 以下同様に、 *(cPtr + n) == cPtr[n] ですから、 *(cPtr + n) または cPtr[n] と書くことで、cPtr が指している領域からnバイト分だけ離れた領域にアクセスできます(ただし、n=0~3)。

ShiftTail
質問者

お礼

なんとなく理解することはできました。 他にも情報を集めていくことにします。 情報ありがとうございます。

その他の回答 (4)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

>unsigned char *cPtr;で宣言していますので、 >多分これが、ポインター cPtr が指している領域の「先頭だけ」を >指しているのかなという気がしてきました。 ポインター変数を定義する際の * と、そのポインター変数が指している領域にアクセスする際の * とは、意味が別である、ということをおわかりではないようですね。

ShiftTail
質問者

補足

情報ありがとうございます。 >そのポインター変数が指している領域にアクセスする際の 仰られるとおり、わかっていないみたいです。

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

wsprintf(cData,"%02X",*cPtr) の結果が(61,61,62,62)になる、ということ自体が変です。 もしかして wsprintf(cData,"%02X",*cPtr)が wsprintf(cData,"%02X %02X %02X %02X",*cPtr,*cPtr(+1),*cPtr(+2),*(cPtr+3)) みたいに、文字列分繰り返される、とか考えてないんですか?

ShiftTail
質問者

補足

情報ありがとうございます。 >wsprintf(cData,"%02X %02X %02X %02X",*cPtr,*cPtr(+1),*cPtr(+2),*(cPtr+3)) これは思いつきませんでした。メモリ内容を1つずつ動かしているんですよね。 ちょっと解決できそうな気がします。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>3.wsprintf(cData,"%02X",*cPtr);にて、文字列を取り出し16進表記表示で、cDataに格納します。 *cPtr と書かれていますので、ポインター cPtr が指している領域の「先頭だけ」を cData に格納していることは明らかです。

ShiftTail
質問者

補足

情報ありがとうございます。 unsigned char *cPtr;で宣言していますので、 多分これが、ポインター cPtr が指している領域の「先頭だけ」を 指しているのかなという気がしてきました。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

>3の段階で、全文字を取り出すのではなく、1文字文(61)しか取り出さないのはなぜなのでしょうか? ⇒(61 61 62 62)が抜けませんでした。 cPtrの型がわかりませんが、1文字分だけ取り出すように書いてるからです。

ShiftTail
質問者

補足

情報ありがとうございます。 >cPtrの型がわかりませんが、1文字分だけ取り出すように書いてるからです。 unsigned char *cPtr; の宣言をしております。 char *cPtrは、1バイト宣言なので これによって1文字分だけ取り出しているのでしょうか?

関連するQ&A