¿Los punteros a estructuras en C funcionan de manera diferente a otros punteros? Por ejemplo en este código:
typedef struct node { int data; struct node *next; } node; void insert(node **head, int data) { node *new_node = malloc(sizeof(node)); new_node->data = data; new_node->next = *head; *head = new_node; } int main() { node *head = NULL; insert(&head, 6); ¿Por qué tengo que usar un puntero a un puntero y no puedo usar el head variable en la función de insert como en este ejemplo con matrices?
void moidify(int *arr) { *arr = 3; } int main() { int *array = malloc(8); *array = 1; *(array + 1) = 2; moidify(array); } Aquí no tengo que pasar &array a la función.
No hay diferencia. Si desea cambiar el valor de la variable que envía para que function de tal manera que el cambio sea visible en la función que llamó a la function , debe proporcionar su dirección a la function , que es lo que hace cuando toma la dirección de head
En moidify(array) envía un puntero al primer elemento de la array , por lo que funciona la modificación de los datos de la matriz. Si desea modificar la variable de array en sí (haciéndola apuntar potencialmente a otro lugar), también deberá tomar su dirección. Ejemplo:
void moidify(int **arr) { *arr = realloc(*arr, 128); if(*arr == NULL) { perror(__func__); exit(1); } } int main() { int *array = malloc(8); *array = 1; *(array + 1) = 2; moidify(&array); }Debe comprender cómo funcionan los punteros para obtener este. Aquí, la array de variables no es propiamente una matriz. Es un puntero hacia un espacio de memoria, de tamaño 8 * sizeof(int) . Contiene sólo una dirección. Desde esta dirección puede acceder a los valores de la matriz, se mueve usando esta dirección, al espacio de memoria que desea llenar o leer.
Una vez que comprenda eso, cuando llama a la función moidify , no está pasando la matriz. Ni el espacio de la memoria. Estás pasando, la dirección del espacio de memoria. La función obtiene una copia de la dirección dada, en la variable de argumento int *arr .
Por lo tanto, puede usarlo de la misma manera que lo usa desde la función main .
Si quisiera cambiar la dirección hacia la que iría la variable de array , necesitaría especificar &array en la función receptora, que luego usaría una variable de argumento int ** .
Su ejemplo con struct es similar a esta última parte que acabo de describir, desea cambiar hacia qué dirección apunta el head , por lo que debe dar &head a la función. Para obtener la dirección del head y poder modificar la dirección contenida.
Utiliza una dirección, para acceder al espacio de memoria llamado head , para modificar la dirección dentro del espacio de memoria llamado head , que apunta hacia otro espacio de memoria, donde realmente pertenece su estructura.