Cita:
Iniciado por CalgaryCorpus En mi opinión desinformada, no es posible modificar la dirección de memoria contenida en el identificador de un arreglo. No es que se lie la cosa, es que es imposible hacerlo. Asi que te reto a construir un programa que permite modificar la dirección de memoria contenida en el identificador de un arreglo. Solo por la educación mía y del resto.
Si os fijáis bien, he dicho "con algunos compiladores sí podría hacerse", no he dicho que se pueda en general. La inmensa mayoría de los compiladores modernos (incluyendo los de uso más generalizado) no lo permitirán. La teoría es:
Código C:
Ver originalint x[4] = {1,2,3,4};
int **p;
p = (int **)&x;
*p = (nueva_direccion_de_memoria);
Con esto, se supone que he cambiado la dirección a la que apuntaba x, por lo que, si ahora le digo que me imprima los valors del array x, me sacaría quién sabe qué. En la práctica, con los tres compiladores que tengo a mano en este momento (GCC, Tiny-C y LCC-Win32), x y &x tienen el mismo valor, p apuntaría al comienzo del array, y cualquier cambio que intente hacer a través del puntero p se traduce en que cambio el (los) valor(es) del (los) primer(os) elemento(s) del array, pero el array "sigue en su sitio". Entono, por tanto, un MEA CULPA parcial, aunque no descarto que algún compilador lo permita, por la misma razón que en este código:
Código C:
Ver originalconst int k=1;
int *pk;
int main(void)
{
pk = (int *)&k;
*pk = 7;
return 0;
}
con GCC y con LCC_Win32 el programa termina de forma catastrófica, mientras que con Tiny-C me imprime un valor de 7 (es decir, al final he modificado el valor de algo declarado como const entrando "por la puerta de atrás").
Concluyendo: Con punteros puedes hacer auténticas maravillas... o hundirte en la más honda de las miserias.