Solución:
En C, las matrices y los punteros están estrechamente relacionados. De hecho, por diseño, una matriz es solo una convención de sintaxis para acceder a un puntero a una memoria asignada. * (consulte la nota para obtener más detalles a continuación)
Entonces en C la declaración
anyarray[n]
es lo mismo que
*(anyarray+n)
Usando aritmética de punteros.
Realmente no tiene que preocuparse por los detalles para que “funcione” ya que está diseñado para ser algo intuitivo.
Simplemente cree un puntero, asigne la memoria y luego acceda a ella como una matriz.
Aquí hay algunos ejemplos:
int *temp = null; // this will be our array
// allocate space for 10 items
temp = malloc(sizeof(int)*10);
// reference the first element of temp
temp[0] = 70;
// free the memory when done
free(temp);
Recuerde: si accede fuera del área asignada, tendrá efectos desconocidos.
- Para que quede claro, es el operador de indexación (
[ ]
) que se traduce a aritmética de punteros. Esta no es una matriz en el sentido moderno del tipo. Si (o no) el puntero involucrado apunta a la memoria asignada (dinámicamente) es intrascendente para cómo funciona este operador. En un lenguaje más moderno, podría operar en la matriz como un tipo abstracto (para ver qué tan grande es, por ejemplo), no puede hacer esto en C.
Una matriz sin un tamaño inicial es básicamente una puntero. Para establecer dinámicamente el tamaño de la matriz, debe usar el malloc()
o calloc()
funciones. Estos asignarán una cantidad específica de bytes de memoria.
En su código anterior, declare temp
como int puntero
int *temp;
Luego asigne espacio para ello usando malloc()
o calloc()
. El argumento que toman estas funciones es el número de bytes de memoria para asignar. En este caso, desea suficiente espacio para d
ints. Entonces…
temp = malloc(d * sizeof(int));
malloc
devuelve un puntero al primer byte del bloque de memoria que se acaba de asignar. Las matrices regulares son simplemente punteros al primer byte en un bloque de memoria seccionado, que es exactamente lo que temp
es ahora. Por lo tanto, puede tratar el temp
puntero como una matriz! Al igual que:
temp[1] = 10;
int foo = temp[1];
printf("%d", foo);
Salidas
10
Necesitarás declarar temp
como un int
puntero (en lugar de un int
formación). Entonces, puedes usar malloc
en tus main
(después de tu primera scanf
):
temp = malloc(d * sizeof(int));