feld speicheradresse ermitteln

iodron
laut "jtzt lrne ich spieleprogn mit dX und visual c++"
ermittelt der compiler die speicheradresse eines feldes dadurch das zu der adresse des ersten feldes die große des feldes multipliziert mit dem index (? richtiger begriff) hinzuaddiert wird.
ich hab versucht das zu programmieren:
&Feld[0]+2*sizeof(Feld[0])
müsste ja eigendlich die speicheradresse des 3. feldes ergeben?!
allerdings funktioniert das bei mich nich so recht.

hier der code des progs das ich geschrieben habe.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
#include <iostream>

using namespace std;

int main (int argc, char *argv[])
{
    int * pZeiger;
    int Feld[4] = {1,2,3,4};
    cout << "Felder + Adresse" << "\n";
     for(int i = 0;i<=3;i++)
     {
             cout << "Feld" << i << "\t" << &Feld[i] << "\n" ;
             }
     cout << "adresse von Feld[0]\t" << Feld << "\n adresse von Feld[3] ermitteln durch &Feld[0]+2*sizeof(Feld[0])\n";
     int * p2 = &Feld[0]+2*sizeof(Feld[0]);
     cout << "\n ermittelte adresse =\t"<< p2 << "\twert\t"<<*p2;
     
  cin.get();
  return 0;
}
iodron
ehm also die adresse die für das 3. feld ausgegeben wird stimmt mit -keinem- der felder
die hiermit
for(int i = 0;i<=3;i++)
{
cout << "Feld" << i << "\t" << &Feld[i] << "\n" ;
}
ausgelesen werden überein
Code Monkey
Wenn Du schreibst

code:
1:
int * p2 = &Feld[0]+2*sizeof(Feld[0]);


ist das dasselbe wie

code:
1:
2:
3:
int * p2 = &Feld[8];
// oder
int * p2 = &Feld[0] + 8;


Du überschreitest also die Arraygrenzen.

Richtig ist

code:
1:
2:
3:
int * p2 = &Feld[0] + 2;
// oder einfach
int * p2 = &Feld[2];


Mit "laut ... ermittelt der compiler die speicheradresse eines feldes dadurch das zu der adresse des ersten feldes die große des feldes multipliziert mit dem index (? richtiger begriff) hinzuaddiert wird." sind die vom Compiler erstellten Assembleranweisungen gemeint. Da läuft das so.