この例では、4 つの要素の配列があります。配列のアドレスを含む整数へのポインターを宣言しました。次に、0 番目のインデックスのアドレスを 3 つの異なる方法で表示しました。同様に、1 番目のインデックスのアドレスは、3 つの異なる方法で表示されます。これ (&pNumbers)+0 を出力すると、一意の異なるアドレスが表示されることはかなり理解できます。次の行で、*(&pNumbers+0) は 0 番目のインデックス アドレスを表示します (ポインターによって含まれているため)。ここで問題の部分が来ます。この (&pNumbers)+1 行を出力すると、配列の 0 番目のインデックスが再び表示されます。なんで ?
最初の質問: ポインター アドレス (&pNumbers) を取得すると、新しい一意のアドレスが表示されます。しかし、そのアドレスを合計すると。配列の要素アドレスにどのようにアクセスしていますか? 例えば
enter code here
cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl // new address + 1 but showing address of 0 element.
cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl // showing address of of 1st index
2番目の質問:対応する配列要素を何らかの形で指している場合。配列要素に対応する正しいデータ値が表示されない理由を逆参照します。例えば
enter code here
cout<<" *(&pNumbers+1) "<< *(&pNumbers+1) // assumption was 31 (but displaying some 0x1f)
cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl // assumption was 28 (but displpaying 0x1c)
以下はソースコードです。
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main()
{int number[] = { 31, 28, 31, 30};
int *pNumbers = number;
cout<<" Address of number[0] "<<number<<endl;
cout<<" Address of number[1] "<<number+1<<endl;
cout<<" Address of number[2] "<<number+2<<endl;
cout<<" Address of number[3] "<<number+3<<endl<<endl;
cout<<" Address of &pNumbers "<< &pNumbers<<endl<<endl; // address of pNumbers
cout<<" Address of number "<< number<<endl; // address of array's first element
cout<<" pNumber Address "<< pNumbers<<endl;
cout<<" &(pNumbers[0]) "<< &(pNumbers[0])<<endl<<endl;
cout << " pNumbers+1: " << pNumbers+1<<endl; //address of array's second element
cout<<" (&pNumbers[1]) "<<(&pNumbers[1])<<endl; //
cout<<" (pNumbers+1) "<< (pNumbers+1) <<endl<<endl;
cout<<" (&pNumbers)+0 "<< (&pNumbers)+0<<endl;
cout<<" *(&pNumbers+0) "<< *(&pNumbers+0)<<endl<<endl;
cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl<<endl; // new address + 1 expected but displaying array's 0th index address why ?
cout<<" *(&pNumbers+1) "<<*(&pNumbers+1)<<endl<<endl;
cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl<<endl;
cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl<<endl;
cout<<" (&pNumbers + 3) "<<(&pNumbers+3)<<endl<<endl;
cout<<" *(&pNumbers + 3) "<<*(&pNumbers+3)<<endl<<endl;
cout<<" (&pNumbers + 4) "<<(&pNumbers+4)<<endl<<endl;
cout<<" *(&pNumbers + 4) "<<*(&pNumbers+4)<<endl<<endl;
return 0;
}