Esto es realmente una cosa bastante simple de responder.
Todo lo que está haciendo es matemáticas de puntero, no hay nada inválido al respecto. Si intenta USAR los punteros resultantes de alguna manera, entonces depende de si su proceso tiene acceso a la memoria apuntada por ese puntero y, de ser así, ¿cuáles son sus permisos?
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;
}
Para compilar:
g++ -Werror -Wall foo.cc -o foo
debe producir ninguna advertencia porque el int * b = & array [10] es válida
en realidad tan es la línea subsiguiente agregada por mí para simplemente señalar algo acerca de matemáticas de puntero.
no sólo compilar foo, se ejecutará sin problemas:
./foo
Pointers are: 0x7fff1d356e68 0x7fff1d356e68 0x7fff1d359d20
Básicamente gama sintaxis foo [idx] se corta y representación limpia de matemáticas puntero.
En caso de confusión con respecto a c99, la norma NO afecta a esta matemática de todos modos y está bien definida.
Lo mismo en 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;
}
continuación:
gcc -std=c99 -Wall -Werror -o foo foo.c
./foo
Salidas:
Pointers are: 0x7fff2c7d22c8, 0x7fff2c7d22c8, 0x7fff2c7d5180
Dupe del legendario http://stackoverflow.com/questions/988158/ take-the-address-of-a-one-past-the-end-array-element-via-subscript-legal-by-the –
@Johannes - Tienes razón, votando para cerrar. – Omnifarious