6

私が読んだいくつかのコードには、このような初期化ステートメントがありました

char *array[]= { "something1", "something2", "something3" };

これはどういう意味ですか、そしてそのポインタは実際に何を指しているのですか?それはメモリにどのように割り当てられ、その配列内のすべての要素と要素のすべての文字にアクセスするにはどうすればよいですか?

---編集---そしてこの例のchararray[3]の違いは何ですか。およびchar*array [3]; ---編集---

4

5 に答える 5

8

それはどういう意味ですか?

3つの値(nullで終了する文字列への3つのポインタ)を使用して文字列の配列(char *)を初期化します。

そして、そのポインタは何を指しているのでしょうか?

char*配列の最初の要素を指している必要があります

それはどのようにメモリに割り当てられますか?

3つの文字列と、それに続くnullターミネータ、およびそれらの文字列への3つのポインタを格納するのに十分なメモリが割り当てられます。

array --> pointer to three sequential memory addresses

array[0] --> something1{\0}
array[1] --> something2{\0}
array[2] --> something3{\0}

文字列は必ずしもシーケンシャルメモリにあるとは限らないことに注意してください

どうすればすべての要素にアクセスできますか

「要素」が文字列を意味する場合は、ポインタをループできます。

for(int i=0; i<3; i++)
{
    char* element = array[i];
}

そしてその配列内の要素のすべての文字

配列構文()を使用してcharにアクセスすることもできますが、安全のためにC文字列関数element[i]を使用することをお勧めします(文字列の範囲外のメモリにアクセスすることを心配する必要はありません)。

于 2013-01-28T20:20:29.490 に答える
6

これは、アレイの作成と同時にアレイを初期化する方法です。

このコード

char *array[]= { "a", "b", "c" };

このコードと同じ結果になります。

char *array[3];

array[0] = "a";
array[1] = "b";
array[2] = "c";

詳細については、こちらをご覧ください。

http://www.iu.hio.no/~mark/CTutorial/CTutorial.html#Strings

編集:

char array[3];3の配列ですcharchar *array[3];への3つのポインタの配列ですchar

于 2013-01-28T20:08:00.210 に答える
4

char *Cでは文字列です。

array宣言されている変数の名前です。

[]配列であることを示します。

{ "something1", "something2", "something3" }配列の内容を初期化しています。

要素へのアクセスは次のように行われます。

array[0]最初の要素-「something1」を与えます。

array[1]2番目の要素-「something2」を与えます。

ノート:

コメントで指摘されているように、char *技術的には文字列ではありません。

へのポインタcharです。次のように、メモリ内の文字列を視覚化できます。

<-------------------------->
..134|135|136|137|138|139|..
<-------------------------->
  'H'|'e'|'l'|'l'|'o'|'\0'
<-------------------------->

このメモリブロック(位置134〜139)は、文字列を保持しています。

例えば:

array[0]実際には、「something1」の最初の文字へのポインタを返します。

文字が順番にメモリ内にあるという事実を利用して、さまざまな方法で文字列の残りの部分にアクセスします。

/* ch points to the 's' */
char* ch = array[0];

/* ch2 points to the 'e' */
char* ch2 = ch + 3;

/* ch3 == 'e' */
char ch3 = *ch2;

/* ch4 == 'e' */
char ch4 = *(ch + 3);

/* ch5 == 'e' */
char ch5 = ch[3];
于 2013-01-28T20:10:38.203 に答える
3

これは、charポインタの配列(別名「c文字列」)を定義します。

コンテンツにアクセスするには、次のようにします。

for (int i=0; i<sizeof(array)/sizeof(char*); i++) {
    printf("%s", array[i]);
}
于 2013-01-28T20:10:23.727 に答える
1

arrayへの3つのポインタの配列として宣言しchar、その3つの要素はそれぞれの文字列へのポインタに初期化されます。メモリは、配列自体(3つのポインタ)と文字列に割り当てられます。文字列メモリは静的に割り当てられます。配列のメモリは、静的に(宣言がすべての関数の外部にある場合)、または動的に(通常、CPUの実行スタックに)割り当てられます(宣言が関数の内部にある場合)。

于 2013-01-28T20:09:59.540 に答える