es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cuál es la diferencia entre *root y **root?

Estaba iterando una estructura de datos de tipo árbol que tiene un puntero a su raíz de la siguiente manera:

struct node *root;

cuando tengo que pasar la referencia de esta raíz como parámetro a una función…. tengo que pasarla así:

calcHeight(&root);

En algún lugar,

int calcHeight(struct node **root)      // definición de la función

Mi pregunta es: ¿por qué necesitamos pasar el puntero “root” como “&root”? ¿no podemos pasar simplemente root así:

struct node *root;
calcHeight(root);
int calcHeight(struct node *root);

// EDIT

void someFunct(int *arr){
    printf("arr2 dentro de someFunct es %d\n",arr[2]);
    arr[2]=30;
}

int main()
{
    int *arr=(int*)calloc(10,sizeof(int));
    printf("arr[2] es %d\n",arr[2]);

someFunct(arr);
printf("arr[2] finalmente es %d\n",arr[2]);
return 0;
}

En este caso, “arr” en la función principal se modifica incluso cuando no estoy pasando la dirección de arr.
Entiendo que para estructuras y variables de un solo valor, tenemos que pasar la dirección como “someFunct(&var)”, pero ¿esto no es necesario para los arreglos? para los arreglos escribimos “someFunct(arr)”
Pero no entiendo la razón detrás de esto.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En el escenario dado, se utiliza un puntero doble en la función calcHeight para que los cambios realizados en el puntero root dentro de la función se reflejen fuera de la función.

    Si pasamos el puntero root como argumento, los cambios dentro de calcHeight solo se reflejarán localmente y no se reflejarán fuera de la función.

    En pocas palabras, si pasamos el puntero root utilizando calcHeight(&root) y lo modificamos dentro de la función, los cambios se reflejarán tanto dentro como fuera de la función. Pero si simplemente pasamos el puntero root utilizando calcHeight(root) y lo modificamos dentro de la función, los cambios solo se reflejarán dentro de la función y no fuera.

    En cuanto a la segunda parte de la pregunta, en C, los arrays siempre se pasan como punteros. En otras palabras, cuando pasamos un array a una función, en realidad estamos pasando un puntero al primer elemento del array. Por eso no tenemos que usar el operador ampersand (&) al pasar arrays como argumentos a una función. Por lo tanto, en el fragmento de código dado, los cambios realizados en arr dentro de someFunct se reflejan fuera porque estamos pasando el puntero al primer elemento del array.

Comments are closed.