Dies ist eigentlich eine ziemlich einfache Sache zu beantworten.
Alles, was Sie tun, ist Zeiger Mathematik, es gibt nichts daran Ungültiges. Wenn Sie versuchen, die resultierenden Zeiger irgendwie zu VERWENDEN, hängt es davon ab, ob Ihr Prozess Zugriff auf den Speicher hat, auf den dieser Zeiger zeigt, und wenn ja, welche Berechtigungen haben sie?
foo.cc:
#include <iostream>
using namespace std;
int main() {
int array[10];
int *a = array + 10;
int *b = &array[10];
int *c = &array[3000];
cerr << "Pointers values are: " << a << " " << b << " " << c << endl;
return 0;
}
kompilieren:
g++ -Werror -Wall foo.cc -o foo
sollte keine Warnungen ergeben, da der int * b = & array [10] gültig ist
Eigentlich so ist die folgende Zeile, die ich hinzugefügt habe, um etwas über Zeigermathematik zu sagen.
nicht nur foo kompilieren, wird es ohne Probleme laufen:
./foo
Pointers are: 0x7fff1d356e68 0x7fff1d356e68 0x7fff1d359d20
Grundsätzlich Array-Syntax foo [idx] ist kurz geschnitten und saubere Darstellung von Zeigermathematik.
Für den Fall, dass es etwas Verwirrung in Bezug auf c99 gibt, beeinflusst der Standard diese Mathematik in keiner Weise und gut definiert.
Dasselbe in C99:
#include <stdio.h>
int main() {
int array[10];
int *a = array + 10;
int *b = &array[10];
int *c = &array[3000];
fprintf(stderr, "Pointers are: %p, %p, %p\n" , a , b , c);
return 0;
}
Dann:
gcc -std=c99 -Wall -Werror -o foo foo.c
./foo
Ausgänge:
Pointers are: 0x7fff2c7d22c8, 0x7fff2c7d22c8, 0x7fff2c7d5180
Dupe des legendären http://stackoverflow.com/questions/988158/ Take-the-Adresse-von-einer-Vergangenheit-das-Ende-Array-Element-via-Subscript-Legal-by-the –
@Johannes - Sie haben Recht, zu schließen zu stimmen. – Omnifarious