2016-12-17 18 views
1

xをint x[30]={2,4,8,9,6,3,5,4,7,8,9,6,3,2,}Aのような配列をのようなintへのポインタとして定義するものとします。配列を指す方法の違いは何ですか?

今、私はこれらの違いは何か知りたい:

1)int *A=x[5]

2)int *A ; A=&x[5]

3)int *A=x+5

4)int *A ; *A=x+5

5)int *A ; A=*(x+5)

なぜ番号1,4および5にエラーがありますか?

数字4はエラーですが、数字3はエラーです。なぜこれらは等しくないのですか?

答えて

0

数字1では、を指す変数Aを作成しています。x[5]は、ポインタではなく、intです。したがって、ポインタにintという値を指定すると、エラーが発生します。

は、数2では、あなたはintへのポインタを作成し、&x[5]x[5]のアドレスであるため、それは、変数x[5]を指します。これはうまくコンパイルされますが、書き込んだ方法ではエラーは発生しませんが、初期値を指定しないでポインタを作成することはお勧めしません。 Aを初期化せずに作成すると、既にメモリ内にあった値が使用されます。したがって、エラーを出す前に変数Aを使用すると、プログラムがクラッシュします。代わりに、やることをお勧めします:

int *A = NULL; 
A = &x[5]; 

または単に:

int *A= &x[5]; 

を数3では、あなたは、intへのポインタを作成していると、あなたはそれを価値x + 5を代入しています。 xは、実際にはx[0]x&x[0]と全く同じことです)へのポインタであるため、これは問題ありません。従ってx + 5x[0]の後の5つのメモリスペースである値へのポインタであり、x[5]です。実際、コンパイラがx[5]を見ると、それは*(x + 5)に変換されます。数4で

Aintへのポインタであるので、*AintあるAが指している値です。最初の理由として、x + 5がポインタであり、*Aintであるため、コードはコンパイルされないため、intにポインタ値を割り当てます。これはisn '有効です。しかしそこには別のエラーがあります。イメージングは​​何らかの理由でコンパイルされます。それでは、実行時には、Aが指し示すメモリ空間をとり、その値にx + 5を与えます。問題は、Aが初期化されていないため、Aが別のプログラムで使用されている変数を指している可能性が非常に高いことです。これを防ぐために、あなたのOSはプログラムをクラッシュさせます。あなたが "運が良ければ" Aはあなたのプログラムの変数を指していますので、あなたがプログラムの変数を知らずに新しい値をあなたのプログラムの変数に割り当てます。そうすればプログラムは動作し続けますが、 。

数字5では、Aintへのポインタで、値は*(x + 5)です。前に説明したように、*(x + 5)x[5]とまったく同じもので、intです。したがって、無効なポインタにintの値を割り当てています。何らかの理由でintの値をポインタに代入したい場合は、A = (int*)(*(x + 5))を実行すると正しくコンパイルされますが、実行時にプログラムがクラッシュする可能性があります。次に、Aは、メモリ空間3を指すポインタになります。同様に、Aが指している変数のアドレスがintとしてx[5]に格納されているx[5] = (int)Aを実行することもできます。しかし、私はこれらの種類のものが実際に役立つような状況は見たことがありません。

+0

Re: '... xは実際x [0] ...'へのポインタなので、配列とポインタについて説明するときは注意が必要です。 'x'はポインタではなく、配列です。しかし、式(sizeof'の引数以外の場合、 'x + 5'は式です)に現れるとき、配列の最初の要素へのポインタに変換されます。そして、ポインタ演算を扱います。ポインタに5を加えると5つの要素だけポインタが前進するので、 'x + 5 'は配列' x'の要素5を指すようになります。 –

関連する問題