3

char ポインターと他のデータ型ポインターの初期化について質問があります。具体的には、次のように char ポインターを初期化できます。

char *char_ptr = "Hello World";

私の知る限り、文字列の唯一の特別な点は、それが「0」で終了する文字配列であることです。ただし、次の行為は禁止されています。

int *int_ptr = {1,2,3,4};

しかし、これを行う必要があります:

int int_arr[] = {1,2,3,4};
int_ptr = int_arr;

int_ptr が int_array の最初の要素を指すようにするためです。

char の場合、char_ptr が文字列を指すようにする前に、文字列 "Hello World" を char 配列として明示的に定義していませんが、文字列 "Hello World" を使用して char_ptr を直接初期化しています。

私の質問は、なぜこれが当てはまるのかということです。これを行うことができるが、他の型ではできない文字列の特別な点は何ですか?

前もって感謝します、

シュリラム

4

5 に答える 5

3

C99 以降では、複合リテラルを使用して他の型に対して同じことを行うことができます。

#include <stdio.h>

int main(void) {
    int *ptr = (int[]){ 1, 2, 3, 4 };
    for(int i = 0; i < 4; ++i) {
        printf("%d: %d\n",i, ptr[i]);
    }
    return 0;
}

複合リテラル(int[]){ 1, 2, 3, 4 }は、名前のない を作成するのint[4]と同じように"Hello"、名前のない を作成しchar[6]ます。

したがって、C99 の時点でcharは、より便利な構文を提供するという点でのみ特別です。

于 2013-01-12T16:19:56.253 に答える
1

答えは次のとおりです。

文字列 (リテラル) は特別なものとして扱われます。

信じてください!それを受け入れ、それと共に生きてください。

于 2013-01-12T16:08:02.150 に答える
1

これは、文字列が非常に頻繁に使用されるため、より簡単に文字列を定義する方法が用意されているためです。毎回明示的に文字の配列を作成するよりもはるかに簡単です。

于 2013-01-12T16:09:46.713 に答える
1

"Hello World"文字列リテラルです。タイプは「12 の配列const char」で、静的な保存期間があります。つまり、プログラムの期間中持続するメモリ内の配列を提供します。charあなたが正しく指摘しているヌル文字のために、それは12です。ここで、2 つのケースを考えてみましょう。

const char *char_ptr = "Hello World";配列をその最初の要素へのポインターに変換できるという事実に依存しています。したがってchar_ptr、リテラルが表す静的データの最初の要素を指します。

ではconst char char_arr[] = "Hello World";、文字の配列を初期化するための特別なルールが発生します。得られるのはchar_arr「12 の配列」タイプですconst charが、静的文字列データの文字は配列内の各要素を初期化するために使用されます (§8.5.2)。つまり、配列char_arrは静的文字列データのコピーです。

実行int *int_ptr = {1,2,3,4};すると、エラーが発生します。なんで?上記{1, 2, 3, 4}の文字列リテラルとは違うからです。{1, 2, 3, 4}は初期化子であり、リテラルではありません。実際、これはイニシャライザ リストであり、初期化にのみ使用できます。これはリテラルではありません。、、、、およびその中に値1を持つ静的配列を作成してから、ポインターを提供することはありません。配列を直接初期化するために使用されます。それで、あなたのポイントは何ですか?配列が指す場所がどこにもありません。234int_ptr

ただし、int int_arr[] = {1,2,3,4};この初期化子リストの正しい使用法です。int_arr各要素が初期化子リストの要素に初期化される配列 を取得します。

于 2013-01-12T16:18:38.537 に答える
0

char *char_ptr = "Hello World" を設定すると、文字列リテラルのアドレスが char_ptr に設定されます。ただし、他のデータ型の場合、文字列リテラルに類似するものはありません。したがって、許可されていません。

于 2013-01-12T16:09:23.287 に答える