Back to C Programming
2026-07-125 min read

What is a function?

Learn What is a function? step by step with clear examples and exercises.

Why This Matters

Understanding functions is crucial in C programming as they allow for organizing code into smaller, reusable units. Mastering functions will help you write cleaner, more maintainable programs and prepare you for real-world coding challenges and interviews.

Prerequisites

To fully grasp the concept of functions in C programming, you should already be familiar with:

  1. Basic C syntax (variables, operators, expressions)
  2. Control structures (if...else statements, loops)
  3. Data types (int, float, char, etc.)
  4. Arrays and pointers (optional but recommended for understanding user-defined functions)
  5. Standard library functions (such as printf() and scanf())

Core Concept

What is a Function?

A function in C is a collection of code that performs a specific task. Functions allow you to organize your code into smaller, reusable units, making it easier to manage and maintain large programs. You can think of a function as a custom tool you create for solving common problems.

Function Syntax

The general syntax for defining a function in C is as follows:

return_type function_name(parameters) {
// code block
}
  • return_type specifies the type of value that the function will return. If the function doesn't return any value, you can use void.
  • function_name is the name you give to your custom tool.
  • parameters are optional variables that the function accepts as input. You define them inside parentheses.
  • The code block contains the instructions that the function will execute when called.

Function Call

To use a function, you call it by its name followed by parentheses containing any required arguments:

function_name(arguments);

Example: Creating a Simple Function

Let's create a simple function that calculates the square of an integer:

#include <stdio.h>

int square(int num) {
int result = num * num;
return result;
}

int main() {
int number = 5;
int squared_number = square(number);
printf("The square of %d is: %d\n", number, squared_number);
return 0;
}

In this example, we define a function called square that takes an integer as input and returns its square. In the main function, we call the square function with an argument of 5, store the result in a variable called squared_number, and print it to the console.

Function Scope

Variables declared within a function have local scope, meaning they are only accessible within that function. However, you can also declare variables outside of any function, which gives them global scope, making them accessible throughout the entire program.

int global_variable = 10; // Global variable

void my_function() {
int local_variable = 20; // Local variable
}

Function Prototypes

Before calling a function, you must inform the compiler about its existence and parameters by providing a function prototype. This is done before the main function:

#include <stdio.h>

// Function prototype for square function
int square(int num);

int main() {
int number = 5;
int squared_number = square(number);
printf("The square of %d is: %d\n", number, squared_number);
return 0;
}

// Definition of the square function
int square(int num) {
int result = num * num;
return result;
}

Worked Example

Let's create a more complex function that calculates the factorial of a number using recursion:

#include <stdio.h>

int factorial(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}

int main() {
int number = 5;
int factorial_result = factorial(number);
printf("The factorial of %d is: %d\n", number, factorial_result);
return 0;
}

In this example, we define a recursive function called factorial that calculates the factorial of a given number. The base case is when the input number is either 0 or 1, in which case it returns 1. Otherwise, it multiplies the input number by the result of calling itself with the decremented value (i.e., n - 1). In the main function, we call the factorial function with an argument of 5, store the result in a variable called factorial_result, and print it to the console.

Common Mistakes

1. Forgetting to return a value (if necessary)

If your function is supposed to return a value but doesn't, you will encounter errors when trying to use that function elsewhere in your code.

// Incorrect implementation of square function
void square(int num) {
int result = num * num;
}

2. Not handling the base case correctly (when working with recursive functions)

When defining a recursive function, it's crucial to have a base case that terminates the recursion and returns an appropriate value.

// Incorrect implementation of factorial function
int factorial(int n) {
if (n > 1) {
return n * factorial(n - 1);
} else {
// Forgetting to return the base case value (1)
}
}

3. Using incorrect parameter types or numbers of parameters

Ensure that your function's parameters match the expected data type and number of arguments when calling it.

// Incorrect implementation of square function with wrong parameter type
int square(char num) {
int result = num * num;
return result;
}

4. Not initializing variables (when using recursion)

When working with recursive functions, it's important to ensure that any variables used within the function are properly initialized before they are used in each recursive call.

// Incorrect implementation of factorial function without initializing result variable
int factorial(int n) {
int result = 1; // Initialization of result variable
if (n == 0 || n == 1) {
return 1;
} else {
result *= n * factorial(n - 1);
}
}

Practice Questions

  1. Write a function called sum_of_numbers that takes an array of integers as input and returns their sum.
  2. Create a recursive function called power that calculates the power of a base number to an exponent (e.g., power(3, 4) should return 81).
  3. Write a function called find_max that takes an array of integers as input and returns the maximum value in the array.
  4. Implement a recursive version of the Fibonacci sequence (i.e., a function called fibonacci(n) that calculates the nth number in the Fibonacci sequence).
  5. Write a function called reverse_string that takes a string as input and returns the reversed version of the string.

FAQ

How do I pass multiple arguments to a function?

You can pass multiple arguments to a function by separating them with commas inside the parentheses:

void my_function(int arg1, int arg2, char arg3) {
// code here
}

Can I define functions inside other functions in C?

Yes, you can define functions within other functions in C. This is known as nested functions or inner functions. However, keep in mind that the inner function has access to the variables of its enclosing function.

How do I pass a variable number of arguments to a function (variadic functions)?

To create a variadic function in C, you can use the va_list and va_arg macros provided by the standard library:

#include <stdarg.h>

void my_function(int num_args, ...) {
va_list args;
va_start(args, num_args);

// Access each argument using va_arg and process them accordingly
for (int i = 0; i < num_args; ++i) {
int arg = va_arg(args, int);
// Do something with the current argument
}

va_end(args);
}