構造体のポインタのconst宣言について – プログラミング – Home

構造体のポインタのconst宣言につい...
 
通知
すべてクリア

[解決済] 構造体のポインタのconst宣言について


瀬藤
 瀬藤
(@瀬藤)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

構造体のポインタの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);


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

const char* は 'constなchar' へのポインタ であり、ポインタがconstではありません。
だからポインタ値は変更可能。

同様に

const struct data* は 'constなdata' へのポインタです。
constなdataということは、dataのメンバ全てがconstです。
したがってdataのメンバaはconst、すなわちポインタ自体が変更不能です。


返信引用
瀬藤
 瀬藤
(@瀬藤)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

επιστημηさん、回答ありがとうございます。
さらに質問、いいですか?

>>const struct data* は 'constなdata' へのポインタです。
>>constなdataということは、dataのメンバ全てがconstです。
>>したがってdataのメンバaはconst、すなわちポインタ自体が変更不能です。

ここがわかりません。。。
「dataのメンバ全てがconst」なときの宣言は
「const struct data* XX」 ではなくて、「struct data const* XX」ではないのでしょ
うか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

> 「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 *

どっちも同じですねぇ。


返信引用
瀬藤
 瀬藤
(@瀬藤)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

επιστημηさん、わかりました!!

先ほどの追加質問はの勘違いです。(すみません)

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました