-1

宣言したら

int x = 5 ;
int* p = &x;
unsigned int y = 10 ;
cout << p+y ;

これは C++ で有効なことですか? そうでない場合は、その理由は?

実用性はないのですが、可能でしょうか?

4

4 に答える 4

0

タイプの変数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なりましb3

于 2013-07-17T00:32:27.043 に答える
0

これは C++ で有効なことですか? そうでない場合、その理由は?

はい。コンパイルしようとしていることがわかるようにcout << p+y;有効です。実際には、C スタイルの配列で使用されるものに変換できるp+yほど有効です(C++ での使用を提案しているわけではありません)。*(p+y)p[y]

有効であるということは、それが実際に意味を成すこと、または結果のポインターが有効であることを意味するものではありません。pint を指しているため、結果のポインタは の位置からのオフセットになりsizeof(int) * 10ますx。そして、あなたはそこに何があるか確信が持てません。

于 2013-07-17T00:33:11.877 に答える