los punteros no ahorran memoria, eso ya lo he dicho varias veces, un puntero es unicamente una variable que almacena una direccion de memoria para usarla, sin embargo la memoria que utilizas tiene que estar controlada, porque puedes pisar datos, de todas formas lo puedes pisar tanto con punteros como con arrays.
Efectivamente el uso de punteros no ahora memoria de por si, pero pasar el puntero de algo grande (lo que seria paso por referencia en lenguajes de más alto nivel) si permite ahorrar algo de memoria en el C ANSI.
struct BUFFER {
int8 buf[512];
int8 pos_r;
int8 pos_w;
};
int8 pop_buff (struct BUFFER buf, int8 pos) {
...
}
int8 pop2_buff (struct BUFFER* buf, int8 pos) {
...
}
La diferencia entre
pop_buf y
pop2_buf es que en
pop_buf, cuando es llamada, se le pasa toda una copia de la estructura
buf, lo cual es lento y requiere reservar memoria de pila para toda la estructura. (En los PIC por su peculiar arquitectura, entiendo que usa otro trozo de memoria RAM directamente, ya que no existe memoria de pila de la forma que es habitual en x86, mips , sparc, etc...).
Sin embargo en
pop2_buf, solo se pasa la dirección de memoria en donde esta la estructura, evitando tener que duplicar toda la estructura, y por lo tanto ahorrando memoria al mismo tiempo que se gana velocidad al no tener que duplicar dicha estructura entera.
char array[5];
si ponemos array[100]=10; no nos da error, sin embargo estamos escribiendo en una parte de la memoria de la cual no habemos reservado por lo cual podemos estar sobrescribiendo otra variable en esa direccion.
char *p=&array;
al igual que si ponemos *(p+100)=10; estamos haciendo lo mismo que en el caso anterior
Igualmente *(array +100) también accede la misma dirección de memoria, así como hacer p[100] y 100[p] o 100[array] .