
No.4ベストアンサー
- 回答日時:
>コンパイラがそれを変数aが読み取り専用であることを判断するのに使っているのではないか?
コンパイラはそんな事では判断していません。
コンパイラはaが配列として書かれているので書き換えできないようにしてるだけです。
>ちなみに、
>char *p = "fuga";
>とした場合は、pと&pのアドレスは異なって、pの中身は書き換えられます。
pはポインタ変数であって配列じゃないからです。
私が間違っていたのは、配列名を変数と同じように考えていたことです。
変数だとすると、中身が自分自身を指していて、その内容はa[0]とダブるので矛盾してますよね。
No.2
- 回答日時:
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が読み取り専用であることを判断するのに使っているのではないか?
ということです。態々あ同じアドレスにしている意味を知りたいのです。
No.1
- 回答日時:
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のアドレスが等しいことで読み取り専用と判断しているのか?
ということです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- マウス・キーボード 英語配列のキーボードには変換キーなどありませんが日本語配列のように使うにはどうしたらいいんですか?ど 2 2023/01/20 03:18
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
配列を使わずに、変数名を動的...
-
C++ vectorに配列をプッシュしたい
-
配列をEraseしてもメモリが開放...
-
Functionの戻り値を2次元配列...
-
C# 配列の変数宣言について。
-
2次元配列を戻り値とする関数?
-
ヘッダーファイルからの取り込...
-
C言語 配列の再初期化
-
キーボード配列の違いの対処法
-
配列変数のアドレス
-
if文の判定条件に配列
-
配列で格納したものをmsgboxで...
-
unsigned char の配列で途中で0...
-
配列を含む構造体の初期値について
-
c言語の配列の先頭アドレスが偶...
-
C言語のプログラムについての質...
-
RGB値を画像(PNG・BMPJPEGなど)...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
C# Listを使わずに2次元配列の...
-
【速いブラインドタッチ】手を...
-
配列をEraseしてもメモリが開放...
-
テキストファイルから文字列を...
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
複数の選択範囲の行番号を個別...
-
C# 配列の変数宣言について。
-
C++ vectorに配列をプッシュしたい
-
配列を含む構造体の初期値について
-
VBで構造体の配列を関数に渡す...
-
C言語で特定列だけを抽出して配...
-
キーボードのキー配列について
-
ExcelVBAで質問です。離れた二...
-
2次元配列を戻り値とする関数?
-
unsigned char配列への入力の仕方
-
【C言語】配列の中に配列を入れ...
-
Redimした動的配列はEraseする...
おすすめ情報