プロが教えるわが家の防犯対策術!

(1)B S T R s1
(2)B S T R* s2

(1)と(2)では意味が違うのでしょうか
違うのであれば、違いを教えて頂ければ大変ありがたいです。

ネットで調べたところ(2)はポインタの宣言ということだと思ってたんですが
使ってるうちに何が何だかわからなくなってしまいました。

(1)BSTR s1 = ::SysAllocString(L"s1");
というような使い方をしていたんですが

(2)BSTR* s1 = ::SysAllocString(L"s1");
とするとエラーが出てしまいます

できれば、(2)の正しい宣言のしかたも教えて頂ければありがたいです
宜しくお願い致します

A 回答 (2件)

おっしゃる通り、実体とポインタの違いです。



正しい宣言といわれても、どう使いたいのかによります。

BSTR s0;
BSTR* s1 = &s0;

ともできますし、

BSTR* s1 = new BSTR;

ともできますし。

BSTR* s1 = ::SysAllocStr(L"s1");

がエラーになるのは、

double* d = 0.1;

がエラーになるのと同じです。BSTRだから特別というわけではありません。
doubleの場合でもエラーになる理由がわからないのであれば、ポインタに対する理解が不足しているということになります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます
整理したいと思います

BSTR s0;
BSTR* s1 = &s0;
では、BSTR型のs1の中身はs0のポインタです
又は、BSTR型s0のポインタはs1の中に入ってます というような意味で良いんでしょうか


BSTR* s1 = new BSTR;
こちらは、BSTR型のs1の中に新しいBSTRが入ってます。という感じで


BSTR* s1 = ::SysAllocStr(L"s1");
がエラーになるのは、
BSTR型のs1の中に、関数を入れようとしてるからエラーになる。
という解釈で良いんでしょうか

疑問ばかりで申し訳ありません
大変勉強になりました
ありがとうございます

お礼日時:2012/06/07 14:58

> BSTR* s1 = ::SysAllocStr(L"s1");


> がエラーになるのは、
> BSTR型のs1の中に、関数を入れようとしてるからエラーになる。
> という解釈で良いんでしょうか

違います。

SysAllocStringはWindowsのAPIですよね。であれば、BSTRを返す関数です。
BSTRの実体をBSTR*というポインタ型に代入することはできません。

BSTR s0;
BSTR* s1=s0;

としているのと同じです。

ところで、なぜBSTR*にしているのでしょうか?
BSTR*を引数とする関数に渡したいとか?
そうであれば、

BSTR s1 = ::SysAllocString(L"s1");

として、関数に渡す時に&s1にすればいいだけです。
    • good
    • 0
この回答へのお礼

なるほど
BSTR* はBSTRを指すポインタということですね
あああ
だから double* d = 0.1; はエラーになるんですね
ダブルを指すポインタに・・・

&s1についてですが
BSTR s1 = ::SysAllocString(L"s1");として
関数に渡す時に&s1としていたんですが
仕様書に
BSTR* 32ビット文字列ポインタとありましたので
BSTR と BSTR* は違うものなのかと思い質問させて頂きました。

実体とポインタ
大変勉強になりました。
プログラムのバグも改修でき、感謝しております。
ありがとうございました。

お礼日時:2012/06/08 13:05

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