¿Por qué no podemos pasar el puntero por referencia en C?

3 minutos de lectura

¿Por que no podemos pasar el puntero por referencia en
usuario3075740

Estoy aprendiendo C. Estaba escribiendo código para crear una lista vinculada cuando encontré una falla de segmentación. Encontré una solución a mi problema en esta pregunta. Estaba tratando de pasar un puntero por referencia. La solución dice que no podemos hacerlo. Tenemos que pasar un puntero a un puntero. Esta solución funcionó para mí. Sin embargo, no entiendo por qué es así. ¿Alguien puede decir la razón?

  • Porque no hay referencias en C. ¿Necesita una razón por la que no hay referencias en C?

    usuario395760

    5 de junio de 2014 a las 5:28

  • El lenguaje no admite pasar objetos por referencia. Simple como eso.

    – R Sahu

    5 de junio de 2014 a las 5:28

  • C ª todo es pasar por valor (casi puedo oler los chorros de llama calentándose con esa declaración). Si desea tener un parámetro modificable del lado de la persona que llama, el “valor” que pase debe ser la dirección de la cosa a modificar, y el parámetro formal debe declararse como un puntero a ese tipo (incluso si es un puntero, en cuyo caso sería un puntero a puntero). Incluso las matrices se pasan por valor, simplemente sucede que el “valor” según el estándar para una matriz como expresión es la dirección de su primer elemento. Pero sigue siendo un valor (uno que le da acceso para acceder a la var de las personas que llaman, es cierto).

    – WhozCraig

    5 de junio de 2014 a las 5:31


  • Quizás esta publicación también lo ayude a comprender: stackoverflow.com/questions/23963269/… Básicamente, para manipular hacia dónde apunta un puntero, debe tener su dirección. La dirección de un objeto -es- un puntero a un objeto. Por lo tanto, pasar la dirección de un puntero (es decir, un puntero a un puntero) permitirá que la función llamada cambie el lugar al que apunta el puntero.

    – Mahonri Moriancumer

    5 de junio de 2014 a las 5:33


  • En C ++, una “referencia” también es un puntero, simplemente no es visible desde el exterior. Entonces, si pasa un puntero en C (o un puntero a un puntero en su caso) es el mismo código que en C++ pasando una referencia, solo difiere la sintaxis.

    – Devolución

    5 de junio de 2014 a las 5:33

1646966530 96 ¿Por que no podemos pasar el puntero por referencia en
david ranieri

Desde El lenguaje de programación C – Segunda edición (K&R 2):

5.2 Punteros y Argumentos de Función

Dado que C pasa argumentos a las funciones por valor, no hay forma directa de que la función llamada altere una variable en la función que llama.

Los argumentos de puntero permiten que una función acceda y cambie objetos en la función que la llamó.

Si entiendes que:

void fn1(int x) {
    x = 5; /* a in main is not affected */
}
void fn2(int *x) {
    *x = 5; /* a in main is affected */
}
int main(void) {
    int a;

    fn1(a);
    fn2(&a);
    return 0;
}

por la misma razón:

void fn1(element *x) {
    x = malloc(sizeof(element)); /* a in main is not affected */
}
void fn2(element **x) {
    *x = malloc(sizeof(element)); /* a in main is affected */
}
int main(void) {
    element *a;

    fn1(a);
    fn2(&a);
    return 0;
}

Como puede ver, no hay diferencia entre una int y un puntero a elemento, en el primer ejemplo necesita pasar un puntero a inten el segundo necesitas pasar un puntero a puntero a elemento.

  • Parece que está citando alguna fuente (comienzo de su respuesta). ¿Te importaría mencionar esta fuente?

    – alk

    6 de junio de 2014 a las 5:59


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad