Programación C/C++ · 15 min read · Oct 09, 2025

Aprendiendo C/C++ Paso a Paso - Página 6

06. Paso a Paso C/C++ — Programación en C - Funciones

Funciones

I. Introducción
II. Definición de función
III. Tipos de funciones
IV. Funciones integradas

| | 1. Funciones numéricas

  1. Funciones de cadena
  2. Funciones de prueba de caracteres | | | V. Funciones definidas por el usuario | | | 1. Funciones simples
  3. Función con argumentos
  4. Función con retornos
  5. Función con recursión | | | VI. Punteros y funciones | | | 1. Paso de parámetros por referencia
  6. Llamada por valor
  7. Llamada por referencia | | | VII. Local vs Global | | | VIII. Especificadores de clase de almacenamiento | | | Clase de almacenamiento automática
    Clase de almacenamiento de registro
    Clase de almacenamiento estática
    Clase de almacenamiento externa |

I. Introducción

Aquí hay un programa para imprimir la dirección de una persona dos veces, que está escrito en ambos métodos utilizando funciones y sin utilizar funciones. Demostrará la ventaja de las funciones.

| | #include
int main()
{
printf(“\nNombre de la Persona”);
printf(“\nCalle, Apartamento//Casa No. “);
printf(“\nCódigo postal, Ciudad”);
printf(“\nPaís”);

printf(“\nNombre de la Persona”);
printf(“\nCalle, Apartamento//Casa No. “);
printf(“\nCódigo postal, Ciudad”);
printf(“\nPaís”);

return 0;
} | #include
void address()
{
printf(“\nNombre de la Persona”);
printf(“\nCalle, Apartamento//Casa No. “);
printf(“\nCódigo postal, Ciudad”);
printf(“\nPaís”);
}

int main()
{
address();
address();

return 0;
} |

II. Definición de Función

Un bloque de declaración, que tiene la capacidad de aceptar valores como argumentos y devolver resultados al programa que llama. Así que, una función es un bloque de declaraciones autónomo que realiza una tarea específica.

III. Tipos de funciones

| | - Funciones integradas/ Funciones de biblioteca/ Funciones predefinidas

  • Funciones definidas por el usuario |

IV. Funciones de Biblioteca

Las funciones de biblioteca son diseñadas por el fabricante del software, se cargan en el disco cada vez que se carga el software.

Las siguientes funciones son ejemplos de las funciones de biblioteca.

1. Funciones Numéricas

FunciónSintaxisEj.Resultado
AbsAbs(n)abs(-35)35
ceilceil(n)ceil(45.232)46
floorfloor(n)floor(45.232)45
fmodfmod(n,m)fmod(5,2)1
coscos(n)cos(60)0.5
sinsin(n)sin(60)0.866
tantan(n)tan(60)1.732
sqrtsqrt(n)sqrt(25)5
powpow(n,m)pow(2,3)8

2. Funciones de Cadena

FuncionesSintaxisEj.
strlenstrlen(str)strlen(“Computadora”)
strcpystrcpy(target,source)strcpy(res,”Pasa”)
strcatstrcat(target,source)strcat(“mag”,”gic”)
strcmpstrcmp(str1,str2)strcmp(“abc”,”Abc”)
strrevstrrev(target,scr)fstrrev(res,”LIRIL”)

3. Funciones de Prueba de Caracteres

FunciónDescripción
isalnumes una letra o dígito
isalphaes una letra
isdigites un dígito
iscntrles un carácter de control ordinario
isasciies un carácter ASCII válido
isloweres un carácter en minúscula
isupperes un carácter en mayúscula
isspacees un carácter de espacio
isxdigites un carácter hexadecimal

Hay una enorme biblioteca de funciones disponibles, te he dado una pequeña porción de ella. Para más funciones de biblioteca consulta el Manual de Ayuda.

V. Funciones Definidas por el Usuario

Los programas que ya has visto realizan divisiones de trabajo. Cuando llamas a gets, puts, o strcmp, no tienes que preocuparte de cómo funcionan internamente estas funciones.

Estas y alrededor de 400 otras funciones ya están definidas y compiladas para ti en la biblioteca Turbo C. Para usarlas, solo necesitas incluir el archivo de encabezado apropiado en tu programa, “La biblioteca de tiempo de ejecución,” en la referencia de biblioteca para asegurarte de entender cómo llamar a las funciones, y qué valor (si lo hay) devuelve.

Pero necesitarás escribir tus propias funciones. Para hacerlo, necesitas dividir tu código en secciones discretas (funciones) que cada una realice una tarea única y comprensible para tus funciones, puedes llamarlas a lo largo de tu programa de la misma manera que llamas a las funciones de la biblioteca C.

Pasos para implementar una función

| | 1. Declaración

  1. Llamada a la función
  2. Definición |

| | • Cada función debe ser declarada al principio del programa.
• La definición de la función contiene el código real de la tarea de ejecución.
• Si una función está definida al principio del programa, no hay necesidad de declaración de función. |

Un ejemplo de función para demostrar la implementación

| | / 32_egfun.c /
#include

void address(); / Declaración /

int main()
{
address(); / Llamada a la función /
address(); / Llamada a la función /

return 0;
}

void address() / Definición /
{
printf(“\nNombre de la Persona”);
printf(“\nCalle, Apartamento//Casa No. “);
printf(“\nCódigo postal, Ciudad”);
printf(“\nPaís”);
} |

Las funciones definidas por el usuario se pueden dividir en 4 tipos según cómo las estamos llamando.

| | 1. Funciones Simples

  1. Función con Argumentos
  2. Función con Retornos
  3. Función con Recursión |

1. Funciones Simples

Realiza una tarea específica solamente, no necesita argumentos ni valores de retorno.

Ejemplo de Función Simple

| | / 33_line.c /
#include
void line(); / Declaración /
int main()
{
line(); / Llamada a la función /
return 0;
}
void line() / Definición /
{
int i;
for(i =1;i<80; i++)
putch(‘*’);
} |

2. Función con Argumentos

Una función que acepta argumentos, se conoce como función con argumentos.

Ej.

| | / 34_argu.c /
void line(char ch, int n)
int main()
{
line(“-“, 50);
line(“*”, 8);
return 0;
}
void line(char ch, int n)
{
int i;
for( i = 1; i<=n; i++ )
putch(ch);
} |

3. Función con valores de retorno

Una función que puede devolver valores al programa que llama se conoce como función con valores de retorno.

Ej.

| | / 35_retu.c /
int abs(int n);
int main()
{
int res;
printf(“%d”, abs(-35))

res = abs(-34); / Llamada a la función/

printf(“%d”, res);
return 0;
}
void abs(int n)
{
if( n < 0 )
n = n * -1;
return n;
} |

4. Función con Recursión

Si una declaración dentro del cuerpo de una función llama a la misma función se llama ‘recursión’. A veces se llama ‘definición circular’, la recursión es, por lo tanto, el proceso de definir algo en términos de sí mismo.

Ejemplos de funciones recursivas

| | / El siguiente programa demuestra la llamada de función a sí misma /
int main( )
{
printf(“\nHola”);
main( ); / Una función, que puede llamarse a sí misma /
return 0;
} No ejecutes este programa, es solo una explicación, por lo tanto, el programa no es lógicamente válido.

El mismo resultado se puede alcanzar utilizando otra función: void disp( );

int main( )
{
disp( );
return 0;
}

void disp( )
{
printf(“\nHola”);
disp( );
} |

El programa debe terminar en un cierto punto, por lo que la clave de la recursión radica en una interrupción suave, que se puede definir utilizando una declaración condicional.
Consulta el siguiente ejemplo:

| | / 36_recursion.c /
int i = 1;      / Declarando una variable global /
void disp( );
int main( )
{
disp( );
return 0;
}

void disp( )
{
printf(“\nHola %d “, i);
i ++;
if( i < 10 ) / si el valor de i es menor que 10 entonces llama a la función nuevamente /
disp( );
} |

| | Programa para encontrar el factorial del número dado:
/ 37_fact.c /
int factorial(int x);
void main
{
int a, fact;
printf(“\nIngresa cualquier número “); scanf(“%d”, &a);
fact = factorial(a);
printf(“\nEl factorial es = %d”, fact);
}
int factorial(int x)
{
int f = 1, i;
for( i = x; i>=1; i–)
f = f i;
return f;
} | Para encontrar el factorial de un número dado utilizando recursión
/
38_fact.c /
int rec_fact(int x);
int main( )
{
int a, fact;
printf(“\nIngresa cualquier número “); canf(“%d”, &a);
fact = rec_fact(a);
printf(“\nEl valor del factorial es = %d”, fact);
return 0;
}
int f = 1;
int rec_fact(int x)
{
if( x > 1)
f = x
rec_fact(x-1);
return f;
} |

VI. Punteros y Funciones

| | Paso de Parámetros por Referencia
Llamada por valor
Llamada por Referencia
|

1. Paso de Parámetros por Referencia

El puntero puede ser utilizado en la declaración de funciones y esto hace que una función compleja sea fácilmente representada y accesible. La definición de la función utiliza punteros en ella, de dos maneras

| | – Llamada por valor

  • Llamada por referencia |

El mecanismo de llamada por referencia es más rápido en comparación con el mecanismo de llamada por valor porque en la llamada por referencia, se pasa la dirección y la manipulación con las direcciones es más rápida que con las variables ordinarias. Además, solo se crea una ubicación de memoria para cada uno de los parámetros reales.

Cuando una parte del programa, los argumentos reales, llama a una función y los valores alterados dentro de la función serán devueltos a la parte del programa que llama en la forma alterada. Esto se denomina llamada por referencia o llamada por dirección. El uso de punteros como argumento de función en este mecanismo permite que los objetos de datos sean alterados globalmente, es decir, dentro de la función así como dentro de la parte del programa que llama. Cuando se pasa un puntero a la función, se pasa la dirección del argumento a las funciones y el contenido de esta dirección se accede globalmente. Los cambios realizados en los parámetros formales (parámetros utilizados en la función) afectan el valor original de los parámetros reales (parámetros utilizados en la llamada de función en el programa que llama).

Ej.

| | / 39_func.c /

void func_c( int *x );

int main()
{
int i = 100;
int *a;
a = &i;
printf(“\nEl valor es %d”, i);
func_c(a);
printf(“\nEl valor es %d”, i);
return 0;
}

void func_c( int x )
{
(
x) ++;
printf(“\nEl valor en la función es %d “, *x);
} |

En el programa anterior, hay un total de tres declaraciones ‘printf’, dos en la función main() y una en el subprograma de función. Debido al efecto de la primera declaración printf, el valor de i se imprime como 100. Luego se realiza la llamada a la función y dentro de la función, el valor se altera y es 101 debido al incremento. El valor alterado se devuelve nuevamente a main() y se imprime como 101.

Por lo tanto, la salida es:

| | El valor es 100
El valor en la función es 101
El valor es 101 |

Más sobre Llamadas a Funciones

Habiendo tenido el primer encuentro con punteros, volvamos ahora a lo que originalmente nos propusimos aprender: los dos tipos de llamadas a funciones: llamada por valor y llamada por referencia. Los argumentos generalmente pueden ser pasados a la función de una de las dos maneras:

| | a. Enviando los valores de los argumentos
b. Enviando las direcciones de los argumentos |

2. Llamada por Valor

En el primer método, el ‘valor’ de cada uno de los argumentos reales en la función que llama se copia en los correspondientes argumentos formales de la función llamada. Con este método, los cambios realizados en los argumentos formales en la función llamada no tienen efecto en los valores de los argumentos reales en la función que llama. El siguiente programa ilustra la Llamada por Valor.

| | / 40_callbyvalue.c /
void swap( int x, int y )
int main( )
{
int a = 10, b = 20;
swap( a ,b );
printf(“\n a = %d, b = %d “, a, b);
return 0;
}
void swap( int x, int y )
{
int t;
t = x;
x = y;
y = t;
printf(“\nx = %d, y = %d”, x, y);
} |

La salida del programa anterior sería:

| | x = 20 y = 10
A = 10 b = 20 |

Ten en cuenta que el valor de a y b permanece sin cambios después de intercambiar el valor de x y y.

3. Llamada por Referencia

Esta vez las direcciones de los argumentos reales en la función que llama se copian en los argumentos formales de la función llamada. Esto significa que utilizando estas direcciones tendríamos acceso a los argumentos reales y, por lo tanto, podríamos manipularlos. El siguiente programa ilustra este hecho.

| | 41_callbyref.c /

void swap( int x, int y )

int main()
{
int a = 10, b = 20;
swap( &a, &b);
printf(“\na = %d, b = %d”, a, b);
return 0;
}

void swap( int x, int y )
{
int t;
t = x; x = y; y = t;
} |

La salida del programa anterior sería:

| | A = 20, b = 10 |

Ten en cuenta que este programa logra intercambiar los valores de a y b utilizando sus direcciones almacenadas en x y y. Generalmente en la programación en C hacemos una llamada por valor. Es decir, en general no puedes alterar los argumentos reales. Pero si lo deseas, siempre se puede lograr a través de una llamada por referencia.

Usando la llamada por referencia inteligentemente

podemos hacer una función, que puede devolver más de un valor a la vez, lo cual no es posible ordinariamente. Esto se muestra en el programa dado a continuación.

| | / 42_callbyref.c /
void areaperi(int r, float a, float p)
int main()
{
int radius;
float area, perimeter;
printf(“\nIngresa el radio de un círculo:”); scanf(“%d”, &radius);

areaperi(radius, &area, &perimeter);

printf(“\nÁrea = %f “, area);
printf(“\nPerímetro = %f”, perimeter);
return 0;
}
void areaperi(int r, float a, float p)
{
a = 3.14 r r; p = 2 3.14 r;
} |

Y aquí está la salida:

| | Ingresa el radio de un círculo 5
Área = 78.500000
Perímetro = 31.400000 |

Aquí, estamos haciendo una llamada mixta, en el sentido de que estamos pasando el valor de radius pero, la dirección de area y perimeter. Y dado que estamos pasando las direcciones, cualquier cambio que realicemos en los valores almacenados en la dirección contenida en las variables a y p, haría que el cambio sea efectivo en main. Por eso, cuando el control regresa de la función areaperi( ) podemos imprimir los valores de area y perimeter.
Así, hemos podido devolver dos valores de una función llamada, y por lo tanto, hemos superado la limitación de la declaración return, que solo puede devolver un valor de una función a la vez.

VII. Variables Locales vs Globales

De acuerdo con el Alcance de los Identificadores, las variables se declaran como de tipos.

| | / 42_globalid.c /
int i=4000; / Declaración de variable global/
int main()
{
int a=10, b=20; / Variable Local /
int i=100; / Variable Local /
printf(“%d %d”, a, b);
printf(“\nLocal i : %d”, i); / Accediendo a la variable Local /
printf(“\nGlobal i : %d “, ::i); / Accediendo a la variable Global /
return 0;
} |

Nota: El operador de Resolución de Alcance ( :: ) solo puede estar disponible en C++.

VIII. Especificadores de Clase de Almacenamiento

Hasta este punto, ya estamos familiarizados con la declaración de variables. Para definir completamente una variable, uno necesita mencionar no solo su ‘tipo’ sino también su ‘Clase de Almacenamiento‘.
De acuerdo con esta sección, las variables no solo tienen un ‘tipo de dato’, también tienen una ‘Clase de Almacenamiento’.

Las Clases de Almacenamiento son de 4 Tipos

| | 1. Clase de Almacenamiento Automática

  1. Clase de Almacenamiento de Registro
  2. Clase de Almacenamiento Estática
  3. Clase de Almacenamiento Externa |

1. Clase de Almacenamiento Automática

Palabra claveauto
AlmacenamientoMemoria
Valor por DefectoNulo
AlcanceLocal al bloque en el que se define la variable
VidaHasta la ejecución de su bloque

Ej:

| | / 43_auto.c /
#include
int main()
{
auto int i, j;
printf(“%d %d”, i, u);
return 0;
} |

2. Clase de Almacenamiento de Registro

Palabra claveregister
AlmacenamientoRegistros de CPU
Valor por DefectoNulo
AlcanceLocal al bloque en el que se define la variable
VidaHasta la ejecución de su bloque

Ej:

| | / 44_register.c /
#include
int main( )
{
register int i, j;
for(i=1;i<=10;i++)
printf(“\n%d”, i);
return 0;
} |

3. Clase de Almacenamiento Estática

Palabra clavestatic
AlmacenamientoMemoria
Valor por DefectoCero
AlcanceLocal al bloque en el que se define la variable
VidaEl valor de la variable persiste entre diferentes llamadas a funciones

Ej:

| | / 45_static.c /
#include
void add();
int main()
{
add();
add();
add();
return 0;
}
void add()
{
static int i = 1;
printf(“%d\n”,i++);
} |

4. Clase de Almacenamiento Externa

Palabra claveextern
AlmacenamientoMemoria
Valor por DefectoCero
AlcanceGlobal
VidaMientras la ejecución del programa no llegue a su fin

Ej:

| | / 46_extern.c /
#include
int i;
void add(); / Variable Externa /
int main( )
{
extern j=10; / Variable Externa /
for(i=1;i<=10;i++)
add();
return 0;
}
void add( )
{
j++;
printf(“%d %d\n”, i, j);
} |

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.