電子書籍の厳選無料作品が豊富!

1.DumpDatというポインタに、テキストファイルから読み出した文字列(=aabb)を格納します。
2.cPtr=pDoc->GetDumpData(); にて、DumpDatのアドレスを取得し、cPtrに格納します。
3.wsprintf(cData,"%02X",*cPtr);にて、文字列を取り出し16進表記表示で、cDataに格納します。
4.TextOut(表示する文字数,文字の高さ,cData)で、cDataを表示します。

このとき、
1の時:DumpDatにファイルから読み出したデータは「(aabb)が入っていると考えています。
2の時:cPtrには、アドレスが格納されていると考えています。
3の時:cDataには、(61,61,62,62)が入ると考えています。
4の時:(61 61 62 62)が表示されると考えています。

<結果>
考えた内容と結果が異なりましたので、トレースしてみたところ、
 ・3の時に、「cData」には、(61)のaの一文字しか格納されていませんでした。
 ・結果、4の時に表示される文字は、61の1文字分でした。

3の段階で、全文字を取り出すのではなく、1文字文(61)しか取り出さないのはなぜなのでしょうか?
⇒(61 61 62 62)が抜けませんでした。

<質問>
ポインタから文字列を取り出す際は、1文字しか取り出さないのでしょうか?

ご教授よろしくお願いします。

A 回答 (5件)

ポインター cPtr が4バイトの領域を指している、ということは間違いないのですか?


だとすれば、C言語の構文上、
*cPtr == *(cPtr + 0) == cPtr[0]
ですから、
*cPtr
と書くことで、cPtr が指している領域の先頭にアクセスできます。
以下同様に、
*(cPtr + n) == cPtr[n]
ですから、
*(cPtr + n)
または
cPtr[n]
と書くことで、cPtr が指している領域からnバイト分だけ離れた領域にアクセスできます(ただし、n=0~3)。
    • good
    • 0
この回答へのお礼

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

情報ありがとうございます。

お礼日時:2012/09/03 13:59

>unsigned char *cPtr;で宣言していますので、


>多分これが、ポインター cPtr が指している領域の「先頭だけ」を
>指しているのかなという気がしてきました。

ポインター変数を定義する際の
*
と、そのポインター変数が指している領域にアクセスする際の
*
とは、意味が別である、ということをおわかりではないようですね。

この回答への補足

情報ありがとうございます。

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

補足日時:2012/08/29 22:06
    • good
    • 0

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))
みたいに、文字列分繰り返される、とか考えてないんですか?

この回答への補足

情報ありがとうございます。

>wsprintf(cData,"%02X %02X %02X %02X",*cPtr,*cPtr(+1),*cPtr(+2),*(cPtr+3))
これは思いつきませんでした。メモリ内容を1つずつ動かしているんですよね。

ちょっと解決できそうな気がします。

補足日時:2012/08/29 08:50
    • good
    • 0

>3.wsprintf(cData,"%02X",*cPtr);にて、文字列を取り出し16進表記表示で、cDataに格納します。



*cPtr
と書かれていますので、ポインター cPtr が指している領域の「先頭だけ」を
cData
に格納していることは明らかです。

この回答への補足

情報ありがとうございます。

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

補足日時:2012/08/29 08:46
    • good
    • 0

>3の段階で、全文字を取り出すのではなく、1文字文(61)しか取り出さないのはなぜなのでしょうか?


⇒(61 61 62 62)が抜けませんでした。

cPtrの型がわかりませんが、1文字分だけ取り出すように書いてるからです。

この回答への補足

情報ありがとうございます。

>cPtrの型がわかりませんが、1文字分だけ取り出すように書いてるからです。
unsigned char *cPtr;

の宣言をしております。
char *cPtrは、1バイト宣言なので
これによって1文字分だけ取り出しているのでしょうか?

補足日時:2012/08/29 08:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!