3

2 つの変数を定義しました。1 つはポインターで、もう 1 つは配列です。

char* ptr;
char* array;

ptr = "12345";
array = new int[5];

for(int i = 0; i < 5; i++)
    array[i] = i;

while(*ptr != 0)
        cout << *ptr++ << endl;

//Get garbage values
for(int i = 0; i < 5; i++)
    cout << ptr[i];

変数間の主な違いは何だろうと思っていました。そして、配列の方法で「ptr []」の値を出力しようとすると、ガベージ値が取得されるのはなぜですか。変数 "ptr" が 5 文字を指す方法を理解できないようです。これは 1 つしか指すことができないためです。

4

3 に答える 3

7

ポインターと配列には多くの違いがありますが、ガベージが発生する理由はptr、インデックスを使用するまでに、既に "12345" の null ターミネーターを指しているためです。

これを行うたびに:

*ptr++;

ptr指していた次の要素 (つまり、1、2、3、...) を指します。ループが終了すると、ヌル ターミネータ\0を指し、次に でインデックスを作成しようとするとi、未知のメモリを指します。

代わりに一時ポインターを使用して要素を反復処理することをお勧めします。

const char* ptr; // declaring ptr constant in this case is a good idea as well

...

ptr = "12345";
char *tmp = ptr;

...

while(*tmp != 0)
    cout << *tmp++ << endl;
于 2012-12-05T02:35:57.007 に答える
2

ここでは、実際には3つの概念があります。文字へのポインター、動的配列、および文字列リテラルです。

    // Initialise a character pointer to point to a dynamic array of characters
    char* array = new char[5];

    // Assign values pointed to.
    for(int i = 0; i < 5; i++)
        array[i] = i;
    // Read back the values.
    for(int i = 0; i < 5; i++)
         std::cout << array[i];

    // Initialise a character pointer to point to a string literal.
    const char* const ptr = "12345";

    const char* charIterator = ptr;
    while(*charIterator != 0)
        std::cout << *charIterator << std::endl;

    //Another way to read values.
    for(int i = 0; i < 5; i++)
        std::cout << ptr[i];

const式でのが二重に使用されていることに注意してくださいconst char* const ptr。1つ目は文字値が一定であることを意味し、2つ目はポインター自体が一定であることを意味します。後者は、書き込みを防ぎptr++、文字列リテラルの先頭のアドレスへの唯一のハンドルを失うのを防ぎます"12345"

于 2012-12-05T02:56:58.250 に答える
0

ポインター ptr を直接使用すると、ptr が格納した配列の値を指すアドレスが変更されます。このループでは、次のようになります。

while(*ptr != 0)

   cout << *ptr++ << endl;

現在、ptr は配列の末尾 (\0) を指しています。

上記のループの前に最後のループを実行する必要があるかもしれません。

通常は、ニックのやり方がより適切です。

于 2012-12-05T03:24:10.557 に答える