構造体のポインタのconst宣言について教えてください。
構造体のポインタをconst宣言すると、構造体をまるごとconst宣言した
のと同じになるのでしょうか?
下記にコードを書きました。
#サンプルではダブルポインタになってます・・・。
charのダブルポインタをconst宣言しても、個々charのポインタには
_strdupが可能です
構造体の方はメンバ変数に対し_strdupしようとするとコンパイルエラーが発生します。
→「error C2166: 左辺値は const オブジェクトに指定されています。」
この違いは何なのでしょう?
使用環境はWindowsXP,VC++6.0です。
よろしくお願いします。
//OK
const char **a=(const char **)malloc(sizeof(char *)*2);
a[0] = _strdup(aaa);
a[1] = _strdup(bbb);
//NG
struct data{
char *a;
};
const struct data **da=(const struct data **)malloc(sizeof(struct data)*2);
da[0]=(struct data*)malloc(sizeof(struct data));
da[0]->a=_strdup(aaa);
const char* は 'constなchar' へのポインタ であり、ポインタがconstではありません。
だからポインタ値は変更可能。
同様に
const struct data* は 'constなdata' へのポインタです。
constなdataということは、dataのメンバ全てがconstです。
したがってdataのメンバaはconst、すなわちポインタ自体が変更不能です。
επιστημηさん、回答ありがとうございます。
さらに質問、いいですか?
>>const struct data* は 'constなdata' へのポインタです。
>>constなdataということは、dataのメンバ全てがconstです。
>>したがってdataのメンバaはconst、すなわちポインタ自体が変更不能です。
ここがわかりません。。。
「dataのメンバ全てがconst」なときの宣言は
「const struct data* XX」 ではなくて、「struct data const* XX」ではないのでしょ
うか?
> 「dataのメンバ全てがconst」なときの宣言は
> 「const struct data* XX」 ではなくて、「struct data const* XX」ではないのでしょ
うか?
訊くまでもない。試せばわかります。
#include <iostream>
#include <typeinfo>
struct data { char* a; };
int main() {
std::cout << typeid(const data*).name() << std::endl;
std::cout << typeid(data const*).name() << std::endl;
return 0;
}
-- 実行結果 ---
struct data const *
struct data const *
どっちも同じですねぇ。
επιστημηさん、わかりました!!
先ほどの追加質問はの勘違いです。(すみません)
ありがとうございました。