dポイントプレゼントキャンペーン実施中!

例えば
 char a[] = "abcdefghij";
 char *A = "ABCDEFGHIJ";

どちらも文字列として出力できます。

char配列とcharポインタの違いはどこにあるのでしょうか?
どういった場合にどちらを使えばいいのかなどそれぞれのメリット、デメリットを教えてください。

A 回答 (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 の前の // を外すと落ちます。
    • good
    • 0

>どういった場合にどちらを使えばいいのか


 中身を変える可能性のある場合は配列、
 絶対に変えない場合、変えるとしたら全取替えする場合はポインタ
でいかが?

理由はNo1,No2さんの回答の通りです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2020/08/13 01:20

規格上 "こんなの" は「文字列リテラル」と呼んでいる. で文字列リテラル自体は「文字の配列」なんだけどその扱いは場面によってちょっと違って


・原則: 必要なメモリ領域は処理系がどこかに用意する. プログラマーが自分で用意したものではないのでその中身を変えてはいけない
・例外: 配列を初期化するときには, その配列の各要素を文字列リテラル (の各要素) で初期化する. この場合配列が使うメモリ領域はプログラマーが自分で用意したものなのでその中身をどうしようとプログラマーの自由
という感じ.

これをふまえて
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 には決してならない.
    • good
    • 0
この回答へのお礼

詳しくありがとうございます。

お礼日時:2020/08/13 01:20

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を破壊するようなことが起こるかもしれない)
    • good
    • 0
この回答へのお礼

書き換えたい場合は、配列
書き換えないようにしたい場合は、ポインタ
みたいな解釈で大丈夫ですか?

お礼日時:2020/08/13 01:19

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