宣言したら
int x = 5 ;
int* p = &x;
unsigned int y = 10 ;
cout << p+y ;
これは C++ で有効なことですか? そうでない場合は、その理由は?
実用性はないのですが、可能でしょうか?
タイプの変数int
は、整数値を含むことができる変数です。タイプの変数は、整数値を含むことができる変数へのint*
ポインターです。
すべてのポインタ型は同じサイズを持ち、同じものを含みます: メモリ アドレス。サイズは 32 ビット アーキテクチャの場合は 4 バイト、64 ビット アーキテクチャの場合は 8 バイトです。それらを区別するのは、それらが指している変数の型です。
ポインターは、実行時に動的に割り当てられたバッファーや構造体、または使用されるが別の場所に格納されている任意の種類の変数をアドレス指定するのに役立ちます。
ポインターを使用した算術演算は可能ですが、思ったように動作しません。たとえば+ 1
、型のポインターを合計すると、その値は文字通り ではなく だけint
増加します。これはポインターであるためです。ここでのロジックは、この配列の次のオブジェクトが必要であるということです。sizeof(int)
1
例えば:
int a[] = { 10, 20, 30, 40 };
int *b = a;
printf("%d\n", *b);
b = b + 1;
printf("%d\n", *b);
次のように出力されます。
10
20
b
は整数値 を指しているため、それ10
を合計1
すると、または整数を含む変数は、次の値 を指しています20
。
に格納されている変数b
を使用して操作を実行する場合は、次を使用できます。
*b = *b + 3;
現在b
は同じポインターで、アドレスは変更されていません。しかし、配列10, 20, 30, 40
には値が含まれるように13, 20, 30, 40
なりましb
た3
。
これは C++ で有効なことですか? そうでない場合、その理由は?
はい。コンパイルしようとしていることがわかるようにcout << p+y;
有効です。実際には、C スタイルの配列で使用されるものに変換できるp+y
ほど有効です(C++ での使用を提案しているわけではありません)。*(p+y)
p[y]
有効であるということは、それが実際に意味を成すこと、または結果のポインターが有効であることを意味するものではありません。p
int を指しているため、結果のポインタは の位置からのオフセットになりsizeof(int) * 10
ますx
。そして、あなたはそこに何があるか確信が持てません。