En nuestra primera parte de esta serie de tutoriales en curso, discutimos brevemente sobre las funciones, incluida su declaración y cuerpo. Lo que no discutimos en ese momento fue las múltiples formas en que se llaman las funciones. Aquí, en este tutorial, discutiremos rápidamente las formas que existen.
En lenguaje C, puede llamar a una función de varias maneras:llamar por valor y llamar por puntero o dirección. Analicemos estos dos conceptos con algunos ejemplos fáciles de entender.
Digamos que desea escribir un programa que intercambie dos valores. Así es como puedes hacerlo:
#include <stdio.h>
int main()
{
int a=0, b=0, c=0;
printf("Enter two integer values\n");
scanf("%d %d",&a,&b);
printf("Entered values are: %d and %d", a,b);
c = a;
a = b;
b = c;
printf("\nSwapped values are: %d and %d", a,b);
return 0;
}
Aquí está el resultado de este código con valores ingresados como 5 y 9:
Enter two integer values
5 9
Entered values are: 5 and 9
Swapped values are: 9 and 5
Ahora, suponga que el requisito es tener una función separada, digamos 'intercambiar', que hace todo el trabajo relacionado con el intercambio y se puede llamar cada vez que el programador desea intercambiar dos valores. El siguiente es el código que hace esto:
#include <stdio.h>
void swap (int val1, int val2)
{
int temp = 0;
temp = val1;
val1 = val2;
val2 = temp;
printf("\nSwapped values are: %d and %d", val1,val2);
}
int main()
{
int a=0, b=0;
printf("Enter two integer values\n");
scanf("%d %d",&a,&b);
printf("Entered values are: %d and %d", a,b);
swap(a,b);
return 0;
}
Ahí vas. Se ha creado una función separada denominada 'intercambiar' que recibe dos valores (ingresados originalmente por el usuario y capturados en la función 'principal') como argumentos y luego los intercambia e imprime la salida.
La forma en que se ha llamado 'swap' aquí se conoce como 'llamada por valor'. La razón es que, cuando se realiza la llamada, solo los valores de 'a' y 'b' se pasan a la función 'intercambiar' como argumentos. Estos valores son recibidos por los argumentos 'val1' y 'val2', y son estas variables sobre las que se realiza el proceso de intercambio.
Esto significa que las variables 'a' y 'b' en la función 'principal' continúan manteniendo los valores originales incluso después de que se haya realizado la operación de intercambio. Pero, ¿qué pasa si el requisito es tener valores de 'a' y 'b' intercambiados después de llamar a la función 'intercambiar'? Bueno, aquí es donde entra en escena el método de 'llamada por puntero/dirección'.
Básicamente, lo que hacemos aquí es pasar la dirección de las variables (como 'a' y 'b' en nuestro caso) como argumentos. La función a la que se llama ('intercambio' en este caso) está equipada para recibir direcciones como argumentos y luego el proceso de intercambio se realiza en los valores guardados en estas direcciones, lo que efectivamente significa valores de variables originales ('a' y 'b' aquí ) se intercambian.
Ahora, en el párrafo anterior, dijimos que la función "está equipada para recibir direcciones como argumentos". Bueno, por "equipado" nos referimos a que tiene un tipo especial de argumentos que pueden recibir direcciones. Estos argumentos son variables de tipo 'puntero'. Discutiremos los 'punteros' en detalle en un próximo tutorial, pero por ahora, solo tenga en cuenta que las variables de puntero almacenan direcciones de memoria como valores.
Así es como se declara/define un puntero a un número entero:
int *x;
Básicamente, x es una variable de puntero que se puede usar para almacenar la dirección de memoria de una variable entera. Suponga que 'i' es una variable entera, así es como puede hacer que 'x' almacene la dirección de 'i':
x = &i;
Y cada vez que desee acceder al valor de 'i' a 'x', escriba '*x'. Por ejemplo, así es como puede cambiar el valor de 'i' a, digamos, 10:
*x = 10;
Entonces, con todo esto en mente, así es como puede llamar a 'intercambiar' usando el método de llamada por dirección o puntero:
#include <stdio.h>
void swap (int *val1, int *val2)
{
int temp = 0;
temp = *val1;
*val1 = *val2;
*val2 = temp;
}
int main()
{
int a=0, b=0, c=0;
printf("Enter two integer values\n");
scanf("%d %d",&a,&b);
printf("Entered values are: %d and %d", a,b);
swap(&a,&b);
printf("\nSwapped values are: %d and %d", a,b);
return 0;
}
Así que esta vez, en lugar de pasar valores de 'a' y 'b' como argumentos, pasamos las direcciones de estas variables. En la función 'intercambiar', las direcciones se reciben en dos variables de puntero ('val1' y 'val2'). Y usando las dos variables de puntero, la lógica intercambia directamente los valores de 'a' y 'b'.
Aquí está el resultado:
Enter two integer values
6 8
Entered values are: 6 and 8
Swapped values are: 8 and 6
Este artículo debería haberle dado al menos una idea básica de lo que son las formas de llamar a funciones de 'llamada por valor' y 'llamada por dirección/puntero', y cuándo se pueden usar. Pruebe los ejemplos que hemos enumerado aquí y háganos saber en los comentarios a continuación si tiene alguna duda o consulta.