FC2ブログ

R_SPHERE

ゲームプログラマー(LV5初プロジェクト終了)の管理人の日常です。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

const

プログラムの話です。
興味の無い方は例の如くスルーでお願いします。

今日は const宣言についてです。
変数の値を変えたくないときに宣言しますが、
ポインタが絡むとやや、面倒なことになります。

では、以下のプログラムを見てください。
このコードをコンパイルすると、エラーが出ますが、
どこに問題があるでしょうか?

#define STR1 char*
typedef char* STR2;

void main( void )
{

const char* String1 = "test";
const STR1 String2 = "test";
const STR2 String3 = "test";

char* tmp1 = String1;
char* tmp2 = String2;
char* tmp3 = String3;

return;

}

エラーが出るのは
次の2行です。

char* tmp1 = String1;
char* tmp2 = String2;

まず、説明を簡単にするために #define の確認です。
これはコンパイラによる置換の支持です。
よって、const STR1 は置換され、const char*と同じ意味になります。

では、エラーが出る理由ですが、String1とString2の宣言では、
constはcharに作用しますので、それぞれの文字列を変更できなくなります。
そのため、ただのcharのポインタであるtmpに代入すると、
ポインタ経由で文字列の変更ができてしまうので、エラーとなります。


さて、逆に

char* tmp3 = String3;

がエラーにならないのは何故でしょうか?

ではtypedefの確認です。
typedefは英語の通り型の宣言です。
よって、STR2はcharのポインタ型になり、constはポインタに対して作用します。
つまり、String3が指すアドレスを変えることができなくなります。
しかし、アドレスが指す先の値は関与しません。
そのため、char型のポインタに代入してもアドレスそのものは変更できないので、
エラーが出ません。

ちょっとしたことですが、意図しない動作につながるので
気をつけたいですね。
スポンサーサイト
  1. 2009/10/20(火) 21:08:01|
  2. プログラム
  3. | トラックバック:0
  4. | コメント:0
<<映画 フレッシュプリキュア! おもちゃの国は秘密がいっぱい!? | ホーム | ゲームショー2009>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsphere.blog55.fc2.com/tb.php/103-0cfc2634
この記事にトラックバックする(FC2ブログユーザー)

CLOCK

ACCESS

プロフィール

RYO

Author:RYO
東京近郊在住の
ゲームプログラマー
(LV5 初プロジェクト終了)

Twitter

    follow me on Twitter

    最新記事

    最新コメント

    月別アーカイブ

    カテゴリ

    日常 (25)
    仕事・学校 (34)
    ゲーム・アニメ・マンガ (42)
    レビュー (8)
    プリキュア (23)
    プログラム (5)
    お知らせ (1)
    未分類 (0)

    検索フォーム

    リンク

    このブログをリンクに追加する

    ブロとも申請フォーム

    この人とブロともになる

    QRコード

    QRコード

    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。