![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
#include <stdio.h>
int main()
{
char s1[] = "12345";
char *s2 = "12345";
printf("size of s1 = %d\n", sizeof s1);
printf("size of *s1 = %d\n", sizeof *s1);
printf("size of s2 = %d\n", sizeof s2);
printf("size of *s2 = %d\n", sizeof *s2);
s1[1] = 'e';
//s2[1] = 'f';
return 0;
}
これを実行してみましょう。ちなみに s2 の前の // を外すと落ちます。
No.3
- 回答日時:
>どういった場合にどちらを使えばいいのか
中身を変える可能性のある場合は配列、
絶対に変えない場合、変えるとしたら全取替えする場合はポインタ
でいかが?
理由はNo1,No2さんの回答の通りです。
No.2
- 回答日時:
規格上 "こんなの" は「文字列リテラル」と呼んでいる. で文字列リテラル自体は「文字の配列」なんだけどその扱いは場面によってちょっと違って
・原則: 必要なメモリ領域は処理系がどこかに用意する. プログラマーが自分で用意したものではないのでその中身を変えてはいけない
・例外: 配列を初期化するときには, その配列の各要素を文字列リテラル (の各要素) で初期化する. この場合配列が使うメモリ領域はプログラマーが自分で用意したものなのでその中身をどうしようとプログラマーの自由
という感じ.
これをふまえて
char a[] = "abcdefghij";
この場合例えば a[3] = 't'; のように中身を変えることができる. ただし
a = "xyz";
のように変更することはできない (strcpy とかを使って中身を変える).
char *A = "ABCDEFGHIJ";
A[3] = 't' などとしてはいけない. ただし
A = "XYZ";
のように A の指す場所を変えることはできる.
余談.
複数の文字列リテラルがメモリを共有することはありえるので, 例えば
char *a = "abcde";
char *b = "cde";
のとき b == a+2 かもしれない (しそうでないかもしれない). もちろん
char A[] = "ABCDE";
char B[] = "CDE";
なら B == A+2 には決してならない.
No.1
- 回答日時:
C言語には「文字列」なんて無い
というくらいの気持ちでいた方が理解できるかも。
char a[] = "abcdefghij";
は
char a[] = {'a','b','c','d','e','f','g','h','i','j','\0'};
を簡単にした表現方法です。
aというcharの配列の領域が用意され、初期値として {'a','b','c','d','e','f','g','h','i','j','\0'} が入った状態になります。
char *A = "ABCDEFGHIJ";
は
const char どこかの領域[] = {'A','B','C','D','E','F','G','H','I','J','\0'};
が見えないところで定義されて
char *A= (char *) &(どこかの領域[0])
とその「どこかの領域」の先頭アドレスを char *型変数の A に設定します。
char a[]
の方は、配列a用に領域が割り当てられます。
そのため、
a[4] = 'x' ;
の用に領域を書き換えても問題ありません。
char *A
の方は、A を通して「どこかの領域」にアクセスすることになります。
この「どこかの領域」がどこにあるかは、特に規定がありません。
ただ const (書き込み不可)なので、実際には「PCのメモリの書き込みできないデータ用の領域」に用意されることが多いようです。
そのため、
A[4] = 'X' ;
等とした場合、何が起こるかわかりません。
(たまたま何もなかったかのように動くかもしれないし、PCを破壊するようなことが起こるかもしれない)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語 少しの疑問 4 2022/11/08 02:48
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインタを使って回文かどうか...
-
char*を初期化したいのですが
-
小数点入りの文字列をfloat型に...
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
ポインタ配列
-
[C] 構造体メンバーのカンマ区...
-
char 文字列型 の表現範囲が-12...
-
C言語にて構造体のメンバがNULL...
-
c言語でポインタ変数を用いた配...
-
Run-Timeエラーの原因に関して...
-
strcat関数を自作したいです
-
C言語:小文字を大文字に変換す...
-
csvファイルをfscanfで読み込む...
-
ASCIIコードへの変換方法
-
wsprintf( ポインタ , "%d" , "...
-
const char* s1とただのchar s1...
-
strcat関数
-
char AA[]{"全角文字"};から"全...
-
C++Builder 2009 テキスト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
文字列str内の全ての数字を...
-
char 文字列型 の表現範囲が-12...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
文字列内の数字削除
-
c言語でポインタ変数を用いた配...
-
szとlpszの違い
おすすめ情報