La fuente excelente para aclarar la confusión es Peter Van der Linden, Experto de programación C, C - secretos profundos que las matrices y los punteros no son lo mismo es la forma en que son tratados en la memoria.
Con una matriz,
char new_str[];
, el compilador le ha dado a new_str una dirección de memoria que se conoce tanto en compilación como en tiempo de ejecución, p. 0x1234, por lo tanto, la indexación de new_str es simple usando
[]
. Por ejemplo,
new_str[4]
, en tiempo de ejecución, el código elige la dirección donde reside
new_str
, p. 0x1234 (esa es la dirección en la memoria física).agregando el especificador de índice
[4]
, 0x1234 + 0x4, el valor puede recuperarse.
Considerando que, con un puntero, el compilador le da al símbolo
char *newstr
una dirección, p. 0x9876, pero en el tiempo de ejecución, esa dirección utilizada, es un esquema de direccionamiento indirecto. Suponiendo que newstr estuviera malloc'd
newstr = malloc(10);
, lo que está sucediendo es que, cada vez que se hace una referencia en el código para usar newstr, ya que la dirección de newstr es conocida por el compilador, es decir 0x9876, pero lo que está señalando newstr es variable. En tiempo de ejecución, el código obtiene datos de la memoria física 0x9876 (es decir, newstr), pero en esa dirección hay otra dirección de memoria (ya que la hemos malloclado), por ejemplo, 0x8765 está aquí, el código recupera los datos de esa dirección de memoria que malloc asignado a newstr, es decir, 0x8765.
El char new_str[]
y char *newstr
se utilizan indistintamente, ya que un índice de elementos cero de la matriz se desintegra en un puntero y que explica por qué usted podría newstr[5]
o *(newstr + 5)
Observe cómo se utiliza la expresión puntero a pesar de que hemos declarado char *newstr
, por lo tanto,
*(new_str + 1)
= *newstr;
O
*(new_str + 1)
= newstr[1];
En resumen, la diferencia real entre los dos es cómo se accede a ellos en la memoria.
Consigue el libro y léelo y vividlo y respíralo. Es un libro brillante! :)
Tome un vistazo a este increíble tutorial http://pw2.netcom.com/~tjensen/ptr/cpoint.htm – jyz