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.

¿Es lo mismo pasar un puntero por valor o por referencia?

¿Cuál es la diferencia entre pasar un puntero por referencia y pasar un puntero por valor en C?

Mi comprensión es que cuando se pasan argumentos a los métodos, se crea un nuevo marco de pila y esos valores se copian a diferentes direcciones de memoria a menos que se pasen por referencia. Si se pasan por referencia, se pasan las direcciones de memoria.

Cuando trabajo con punteros, noté que si paso un char* por valor y lo modifico en un marco de pila diferente, cuando vuelvo al marco de pila principal, el valor de ptr se ha modificado.

Escribí un código corto para mostrar a qué me refiero.

//test pointer ref

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void passbyval(char const *lit, char *str){
    printf("---passbyval---\n");
    printf("%s\t%p\n",lit,&lit);
    //modificar cadena
    strncat(&str[2],"/",1);
    printf("%s\t%p\n",str, &str);
}
void passbyref(char const *lit, char *str){
    printf("---passbyref---\n");
    printf("%s\t%p\n",lit,&lit);
    //modificar cadena 
    strncat(&str[1],"/",1);
    printf("%s\t%p\n",str,&str[0]);
}
int main(){

char const *litstr = "hello this is a test";
char *str = (char*)malloc(sizeof(char)*100);
scanf("%[^\n]",str);
printf("---main---\n");
//imprimir valor original y dirección
printf("%s\t%p\n",litstr,&litstr);
printf("%s\t%p\n",str,&str);
passbyval(litstr,str);
//valor modificado y dirección desde pass by value 
printf("\nretfromval: %s\t%p\n",str,&str);
passbyref(&litstr,&str);
//valor modificado y dirección desde pass by ref
printf("\nretfromref: %s\t%p\n",str,&str);
free(str);
return EXIT_SUCCESS;

}

Salida:
enter image description here

¿Es buena práctica no pasar por referencia el char* que se desea modificar en métodos void?

Estoy confundido sobre por qué alguna vez usaría el paso por referencia para punteros si el valor al que hacen referencia se pasa implícitamente por referencia.

Tal vez me esté perdiendo algo, ¿alguien podría explicarlo un poco mejor?</string.h></stdlib.h></stdio.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Pasar un puntero por valor en C significa que se creará una copia del puntero y se pasará a la función. Cualquier cambio realizado en el puntero en sí dentro de la función no se reflejará fuera de la función. Sin embargo, cualquier cambio realizado en la ubicación de memoria a la que apunta el puntero será visible fuera de la función.

    Pasar un puntero por referencia en C significa que se pasa una referencia al puntero original a la función. Cualquier cambio realizado en el puntero en sí dentro de la función se reflejará fuera de la función. Además, cualquier cambio realizado en la ubicación de memoria a la que apunta el puntero también será visible fuera de la función.

    En el ejemplo de código proporcionado, se utiliza pasar por referencia para el puntero a la cadena literal, pero pasar por valor se utiliza para el puntero al arreglo de caracteres. Por lo general, se recomienda utilizar pasar por referencia para los punteros que deben modificarse dentro de una función, ya que esto garantizará que cualquier cambio realizado sea visible fuera de la función.

    Pasar por referencia también es útil al tratar con estructuras de datos complejas que serían ineficientes de copiar, ya que pasar una referencia a la estructura de datos original permite que la función acceda y modifique la estructura original sin crear una copia.

Comments are closed.