4

私はポインタ演算を学んでいて、かなり長い間エラーを出すコードがあります。助けていただければ幸いです(SOでは見つかりませんでした)

int arr [] = {1, 2, 3, 4, 5} ;
for (int i = 0 ; i < 5 ; i++)
{
    cout << *arr ;
    arr++ ;
}
cout << *arr << endl ;

コードブロックで発生しているエラーを理解できません。私はこの声明を受け取っています。

    error: lvalue required as increment operand|
    ||=== Build finished: 1 errors, 0 warnings ===|

[] このコードでは、間接参照や演算子を使用せずに配列を反復処理する必要があります。

4

2 に答える 2

8

配列をインクリメントしようとすると、このエラーが発生します。C ++では、配列の名前が最初のインデックスへの定数ポインタに暗黙的に変換される可能性があるため、これは無効です。配列はコンテナであり、コンテナをインクリメントしても意味がないため、配列をインクリメントすることはできません。

あなたの質問に完全に答えるために、私はいくつかのことを説明する必要があります。試してみましょう。他の人が追加できます。

定数ポインタには3つのタイプがあることを忘れないでください。

1.一定のメモリ位置へのポインタ。これは通常のポインターですが、本質的に定数である変数を指します(変数の事実のみを読み取ります)。これは、それが指している変数の値をそれを介して変更できないことを意味します。通常は、このような定数変数を指すために使用されます。

const int x = 10 ;
const int *ptr = & x ; 

*ptr = 5 ;ここでは、ポインターが定数変数を指しているため、実行できません。

2.メモリ位置へのConstポインタ。これは、プログラム全体で1つのメモリ位置のみを指すことができるポインタです。指している変数の値は変更できますが、ポインター自体は一定です。このように宣言されています。

int x = 10, y = 5 ;
int * const ptr = &x ;

ptr = &y ;プログラムの後半で行うことはできません。配列は、メモリ位置への定数ポインタに暗黙的に変換することもできます。したがって、この方法でインクリメントまたはデクリメントすることはできません。(必要に応じて、ここでそれについて読むことができます: アレイの減衰とは何ですか?

3.定数メモリ位置への定数ポインタ。これは、それ自体が一定であり、一定のメモリ位置も指すポインタです。このように宣言されています。

const int x = 8 ;
const int * const ptr = &x ;

つまり、初期化された場所以外の場所にポインタを向けることはできず、ポインタが指している場所の値を変更することもできません。

コンセプトが今では非常に明確になっていることを願っています。さて、あなたの質問です。ポインタ演算で配列を出力したいのですが、配列自体をインクリメントすることはできません。したがって、これを行う1つの解決策は、別のポインター(通常のポインター)を作成し、それに配列の最初のインデックスのアドレスを割り当てることです。次に、その配列の値をインクリメント、デクリメント、または変更できます。このようなもの。

int arr [] = {1, 2, 3, 4, 5} ;
int *ptr = arr ;
for (int i = 0 ; i < 5 ; i++)
{
    cout << *ptr << " " ;
    ptr++ ;
}
于 2012-08-27T16:15:59.533 に答える
-1

だからあなたはいつでもすることができます:

int arr [] = {1, 2, 3, 4, 5} ; 
int *a = arr;
for (int i = 0 ; i < 5 ; i++) 
{     
  cout << *a ;     
  a++ ; 
} 
于 2012-08-27T16:23:43.310 に答える