web-dev-qa-db-ja.com

char * arrayおよびchar array []

これを書いたら

 char *array = "One good thing about music";

実際に配列を作成しますか?私はそれがこのように同じだということですか?

char array[] = {"One", "good", "thing", "about", "music"};
11
yaylitzis

宣言と初期化

_char *array = "One good thing about music";
_

ポインターarrayを宣言し、31文字の定数配列を指すようにします。

宣言と初期化

_char array[] = "One, good, thing, about, music";
_

31文字を含む文字の配列を宣言します。

はい、配列のサイズは31で、終端の_'\0'_文字が含まれています。


メモリにレイアウトすると、最初は次のようになります。

 + ------- + + ------------------------------ + 
 |配列| -> | 「音楽の良い点」| 
 + ------- + + --------------------------- --- + 

そして、2番目のこのように:

 + ------------------------------ + 
 | 「音楽の良い点」| 
 + ------------------------------ + 

配列は、配列の最初の要素へのポインターに減衰します。次のような配列がある場合

_char array[] = "One, good, thing, about, music";
_

ポインタが必要なときにプレーンarrayを使用すると、_&array[0]_と同じになります。

これは、たとえば、配列を関数への引数として渡すと、ポインタとして渡されることを意味します。

ポインターと配列は、almost交換可能です。たとえば、sizeof(pointer)を使用することはできません。これは、ポインタが指すものではなく、実際のポインタのサイズを返すためです。また、あなたがするとき_&pointer_ポインタのアドレスを取得しますが、_&array_は配列へのポインタを返します。 _&array_はveryarray(または同等の_&array[0]_)とは異なることに注意してください。 _&array_と_&array[0]_は両方とも同じ場所を指しますが、タイプは異なります。上記の配列を使用すると、_&array_はchar (*)[31]型であり、_&array[0]_は_char *_型です。


もっと楽しく:多くの人が知っているように、ポインターにアクセスするときに配列のインデックスを使用することができます。しかし、配列はポインターに減衰するため、配列でポインター演算を使用することは可能です。

例えば:

_char array[] = "Foobar";  /* Declare an array of 7 characters */
_

上記により、次のいずれかを使用して4番目の要素(_'b_ '文字)にアクセスできます

_array[3]
_

または

_*(array + 3)
_

また、加算は 可換 であるため、最後は次のようにも表現できます。

_*(3 + array)
_

楽しい構文につながります

_3[array]
_
36

いいえ、配列を作成していますが、大きな違いがあります。

char *string = "Some CONSTANT string";
printf("%c\n", string[1]);//prints o
string[1] = 'v';//INVALID!!

配列はメモリの読み取り専用部分に作成されるため、ポインターを使用して値を編集することはできませんが、

char string[] = "Some string";

同じ、読み取り専用の定数文字列を作成し、スタック配列にコピーを作成します。それが理由です:

string[1] = 'v';

後者の場合に有効です。
を書く場合:

char string[] = {"some", " string"};

char配列(またはcharポインター)の配列を構築し、それをcharの配列に割り当てるため、コンパイラは文句を言うはずです。これらのタイプは一致しません。次のいずれかを記述します。

char string[] = {'s','o','m', 'e', ' ', 's', 't','r','i','n','g', '\o'};
//this is a bit silly, because it's the same as char string[] = "some string";
//or
char *string[] = {"some", " string"};//array of pointers to CONSTANT strings
//or
char string[][10] = {"some", " string"};

最後のバージョンでは、実際にcan edit ...という文字列の配列(charsの配列)が提供されます。

8

いいえ。実際には「同じ」です

char array[] = {'O', 'n', 'e', ..... 'i','c','\0');

すべての文字は個別の要素であり、文字列ターミネータとして\0文字が追加されています。

char * arraychar array[]にはいくつかの違いがあるため、「同じ」を引用しました。さらに読みたい場合は、 C:charポインターと配列の違い をご覧ください。

2

それは非常に似ています

char array[] = {'O', 'n', 'e', ' ', /*etc*/ ' ', 'm', 'u', 's', 'i', 'c', '\0'};

しかし、読み取り専用のメモリを提供します。

char[]char *の違いについては、 comp.lang.c FAQ 1.32 を参照してください。

2
tom