in

punteros – Pasando por referencia en C

apple touch icon@2

Eso no es pasar por referencia, es pasar por valor como otros dijeron.

El lenguaje C se transmite por valor sin excepción. Pasar un puntero como parámetro no significa pasar por referencia.

La regla es la siguiente:

Una función no puede cambiar el valor real de los parámetros.


Intentemos ver las diferencias entre los parámetros escalares y de puntero de una función.

Variables escalares

Este breve programa muestra el paso por valor utilizando una variable escalar. param se llama el parámetro formal y variable en la invocación de la función se llama parámetro real. Incremento de nota param en la función no cambia variable.

#include <stdio.h>

void function(int param) {
    printf("I've received value %dn", param);
    param++;
}

int main(void) {
    int variable = 111;

    function(variable);
    printf("variable %dm", variable);
    return 0;
}

El resultado es

I've received value 111
variable=111

Ilusión de pasar por referencia

Cambiamos ligeramente el fragmento de código. param es un puntero ahora.

#include <stdio.h>

void function2(int *param) {
    printf("I've received value %dn", *param);
    (*param)++;
}

int main(void) {
    int variable = 111;

    function2(&variable);
    printf("variable %dn", variable);
    return 0;
}

El resultado es

I've received value 111
variable=112

Eso le hace creer que el parámetro se pasó por referencia. No era. Se pasó por valor, siendo el valor de parámetro una dirección. El valor del tipo int se incrementó, y ese es el efecto secundario que nos hace pensar que se trataba de una llamada de función de paso por referencia.

Punteros: pasados ​​por valor

¿Cómo podemos demostrar / probar ese hecho? Bueno, tal vez podamos probar el primer ejemplo de variables escalares, pero en lugar de escalares usamos direcciones (punteros). Veamos si eso puede ayudar.

#include <stdio.h>

void function2(int *param) {
    printf("param's address %dn", param);
    param = NULL;
}

int main(void) {
    int variable = 111;
    int *ptr = &variable;

    function2(ptr);
    printf("ptr's address %dn", ptr);
    return 0;
}

El resultado será que las dos direcciones son iguales (no se preocupe por el valor exacto).

Resultado de ejemplo:

param's address -1846583468
ptr's address -1846583468

En mi opinión, esto demuestra claramente que los punteros se pasan por valor. De lo contrario ptr sería NULL después de la invocación de la función.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

computer illiteracy4

¿Qué es el analfabetismo informático y cómo tratarlo?

LW4my46rEQpwSaZX2bBph4 1200 80

Trucos de DayZ: ¿Hay formas de hacer trampa en el apocalipsis zombie?