重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

C言語で、配列を宣言した場合、

char a[] = "hoge";

変数aは初期化された配列の先頭番地を指しているのですが、この時、
変数aの中身も変数aのアドレス(&a)ともに上記の配列の先頭番地になっているようなのですが、
これによって、配列の変数aは読み取り専用で、書き換えられないということにしていると思っていいのでしょうか?

ちなみに、

char *p = "fuga";

とした場合は、pと&pのアドレスは異なって、pの中身は書き換えられます。

A 回答 (4件)

>コンパイラがそれを変数aが読み取り専用であることを判断するのに使っているのではないか?



コンパイラはそんな事では判断していません。
コンパイラはaが配列として書かれているので書き換えできないようにしてるだけです。

>ちなみに、
>char *p = "fuga";
>とした場合は、pと&pのアドレスは異なって、pの中身は書き換えられます。

pはポインタ変数であって配列じゃないからです。
    • good
    • 0
この回答へのお礼

私が間違っていたのは、配列名を変数と同じように考えていたことです。

変数だとすると、中身が自分自身を指していて、その内容はa[0]とダブるので矛盾してますよね。

お礼日時:2014/10/25 15:14

配列とポインタは本質的には違うということを理解すればいいのではないでしょうか。

    • good
    • 0

No.1でWr5さんが書かれている様に、aは書き換え可能です


ただaは配列ですので、宣言後
a="HOGE"
等といった配列を一度気置き換える代入は出来ません
これは数字など他の配列を使う時と同様です

a[0] = 'H';
a[1] = 'O';
a[2] = 'G';
a[3] = 'E';
等で書き換え可能と確認出来ます

この回答への補足

aとa[0]、a[1]などは別物です。
a[0]は配列aの中身であり、書き換え可能ですが、変数(配列名)aは配列の先頭番地(&a[0])を指していて、それは書き換えられません。
私が知りたいのは、前にも書いたように調べてみると、aと&aのアドレスが同じになっているよう
なので、コンパイラがそれを変数aが読み取り専用であることを判断するのに使っているのではないか?
ということです。態々あ同じアドレスにしている意味を知りたいのです。

補足日時:2014/10/25 13:17
    • good
    • 0

char a[] = "hoge";



char a[5] = {'h','o','g','e','\0'};
は等価だった筈です。

そんなワケで…
>配列の変数aは読み取り専用で、書き換えられないということにしていると思っていいのでしょうか?
書き換え可能です。
単純に初期値が与えられているだけです。
# 初期値の元になる値がメモリ上のどこかにあるかも知れませんが…。
配列の先頭アドレスを別のアドレスに変更する。ということはできませんので念のため。

>ちなみに、
>char *p = "fuga";
>とした場合は、pと&pのアドレスは異なって、pの中身は書き換えられます。

&pはp自身のアドレスで、pの指している箇所はどこか別の(一般的に書き換え禁止の)"fuga"が指しているアドレス…でしょう。
で、「ポインタが指している場所」は変更可能でしょうが、今回の場合で「ポインタが指している先」は(一般的に)書き換え不可になっているかと。



というか、何が問題となっている(何をやりたい)のでしょう?

この回答への補足

言葉の使い方の問題かもしれませんが、

aには代入(別のアドレス)はできません。読み取り専用です。
aの指している先の内容は、文字列操作関数で書き換えられます。

聞きたいのは、コンパイラがどうやってaが読み取り専用であることを判断しているかということです。

aの中身のアドレスと&aのアドレスが等しいことで読み取り専用と判断しているのか?

ということです。

補足日時:2014/10/25 11:02
    • good
    • 0

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