- ベストアンサー
* の役割について
windows プログラミングをVC 2003 で始めたばかりの初心者です。参考書を元にウィンドウプロシージャに変数を書いているときに、 char *szStr = "Windows program"; という文があったのですが、このszStrの前の * はいったいどうゆう役割をはたしているのでしょうか? それに影響されてかTextOut関数を使うときも TextOut{hdc, 10, 10, (LPCTSTR)szStr, (int)sizeof(szStr)}; となってszStr の前に(LPCTSTR)がついています。この(LPCTSTR)がついていない例文もあるのですが どうゆうときに必要でまたどうゆうときに不必要なのでしょうか? 説明に足りないところがあればまた足しますのでよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>どうゆうときに必要でまたどうゆうときに不必要なのでしょうか? これに答えて無かったですね 関数で定義された引数の型と実際に渡す引数の型が違うときに必要で型が同じときには不必要です。 型を変えることをキャストといいます。 (LPCTSTR)szStr はchar*型をLPCTSTR型にキャストしていることになります。 const char *szStr = "Windows program"; か LPCTSTR szStr = "Windows program"; としていればキャストは不要になります。 キャストしなくても警告がでるだけでエラーにならないことが多いですが。
その他の回答 (4)
- aris-wiz
- ベストアンサー率38% (96/252)
> char *szStr = "Windows program"; という文があったのですが、 > このszStrの前の * はいったいどうゆう役割をはたしているのか これは語述される変数がポインタであることを宣言します。 よって、この宣言によって静的な領域に確保される"Windows program" という文字列のポインタを格納する領域szStrが確保され上記の文字列 が格納された領域へのポインタが代入されます。 >この(LPCTSTR)がついていない例文もあるのですが >どうゆうときに必要でまたどうゆうときに不必要なのでしょうか? 本来は不要で行うべきではありません。 しかしC言語上では「メモリの動的確保」など どうしても必要な場合があり本来はこの為の機能です。 C言語上では「キャスト」と呼ばれコンパイラを「騙す」為の 一種のおまじないなので極力使用しないで書くことが望ましいです。 今回であれば、ほかの方も書かれているとおり、szStrを LPCTSTR型で定義すれば、こういったキャストは不要になります。
お礼
ありがとうございました。 たしかに言われるとおり szStr をLPCTSTR で定義したら キャストなしでもできました。 ほんとうにありがとうございました。
- HARAHOROHI
- ベストアンサー率20% (47/229)
こんにちわ。 cのポインタって取っつき辛いモノですよね。 参考書の後の方に載ってませんか? あるいは http://www.sgnet.co.jp/c/6-1.htm こんなサイトから勉強してみるとか。
- php504
- ベストアンサー率42% (926/2160)
*はポインタですね UNICODEでなければ TCHAR = char LPCTSTR = const char* LPTSTR = char* と同じになります
- gonbee774
- ベストアンサー率38% (198/511)
szStrが(charへの)ポインタであることを示しています。 (LPCTSTR)については、キャストする必要があるか否か(もともとLPCTSTRで宣言されているか)だと思いますが…
お礼
なるほどそういうことだったのですね。 LPCTSTR szStr = "Windows program"; と書いて LPCTSTRを省いてデバグしたらたしかに普通にでいきました。 ありがとうございました。