1

私は独学で C++ を学んでおり、ポインターでこのプログラムを作成しています。

15、22、16、18、27、23、および 20 という数値を miles という名前の配列に格納するプログラムを作成します。マイルで格納されたデータを dist という名前の別の配列にコピーし、値をディスト配列。配列要素をコピーして表示するときは、プログラムでポインター表記を使用する必要があります。

だから私は問題を解決し、私のコードは以下の通りです。while ループには次のステートメントがあります while(ptr1 < miles + SIZE)。このステートメントを に変更しwhile(ptr1 < ptr1 + SIZE)て実行すると、セグメンテーション違反が発生します。なんで?マイルは配列ですが、実際にはポインターであることを理解しています。と を実行するcout << ptr1;cout << miles;、出力は同じになります。誰か説明してくれませんか?ありがとうございました。

#include<iostream>
#include<iomanip>

using namespace std;

void prob4()
{
    int miles[] = {15, 22, 16, 18, 27, 23, 20};
    const int SIZE = sizeof(miles)/sizeof(miles[0]);

    int dist[SIZE] = {0};

    int *ptr1 = miles;
    int *ptr2 = dist;

    while(ptr1 < miles + SIZE)
    {
        *ptr2 = *ptr1;
        ptr2++;
        ptr1++;
    }   

    for(int i=0; i < SIZE; i++)
        cout << setw(4) << dist[i];
    cout << endl;

    return;
}

int main()
{
    prob4();
    return 9;
}
4

4 に答える 4

4

あなたはここでいくつかの質問をしています。

条件ptr1 < ptr1 + SIZE は常にtrue と評価されるため、ループは決して終了せず、ポインターは配列の末尾を越えて進み、無効なポインターを逆参照して、未定義の動作を引き起こします(つまり、何かが起こる可能性があります)。障害。

配列変数milesは、実際には配列内の最初の要素へのポインターptr1です。最初は、 とまったく同じです。これが、C++ が配列を処理する方法です。

于 2013-11-12T01:50:43.260 に答える
3

配列はポインターではありません。

ポインターは物を指します。配列にはものが含まれています。

ループの安全な方法は、ポインターの位置ではなく、項目ごとにカウントすることです。

1 つの問題は、終了ポインター値が範囲内にないか、存在しない可能性があることです。

分析 - "ptr1 < マイル + サイズ"
ポインターを配列と比較しないでください。危険です。
これを試してください: "ptr1 < &miles[size]"

分析 - "ptr1 < ptr1 + SIZE"常に変化している
ため、これは移動ターゲットです。ptr1

于 2013-11-12T01:51:19.817 に答える
0

あなたの最初の繰り返しで、ループptr1は実際にはマイルに等しい.

しかし、ptr1 は 2 回目の繰り返しで何に等しいでしょうか?

...

while (...) は反復ごとに評価されます (一部のオプティマイザーは、可能であると判断できる場合、評価を単純化するために巧妙に行う場合があります)。

于 2013-11-12T01:51:03.427 に答える