Function Arguments & Return
Function Arguments (Parameters)
When you call a function, you can pass data to it. The values you pass are called arguments. The variables that receive them in the function definition are called parameters.
In C, there are two ways to pass arguments:
- Pass by Value — a copy of the value is passed (default)
- Pass by Reference — the address (pointer) is passed, so the original can be modified
Pass by Value
A copy of the argument's value is passed. Changes inside the function do NOT affect the original variable.
#include <stdio.h> void doubleIt(int n) { // n is a COPY of the argument n = n * 2; printf("Inside function: n = %d\n", n); } int main() { int x = 5; printf("Before call: x = %d\n", x); doubleIt(x); // Passes a COPY of x printf("After call: x = %d\n", x); // x unchanged! return 0; }
When you call doubleIt(x), C copies the value of x (which is 5) into the parameter n. The function works on its own local copy n, not on the original x. So x remains 5 after the call.
Pass by Reference (Using Pointers)
Pass the address of the variable. The function receives a pointer and can modify the original variable through it.
#include <stdio.h> void doubleIt(int *n) { // n is a POINTER to the original *n = *n * 2; // Modify value at the address printf("Inside function: *n = %d\n", *n); } int main() { int x = 5; printf("Before call: x = %d\n", x); doubleIt(&x); // Pass ADDRESS of x printf("After call: x = %d\n", x); // x IS modified! return 0; }
Classic Example: swap() Function
#include <stdio.h> // WRONG: pass by value — doesn't work! void swapWrong(int a, int b) { int temp = a; a = b; b = temp; // Only local copies swapped } // CORRECT: pass by reference — works! void swapCorrect(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 10, y = 20; swapWrong(x, y); printf("After swapWrong: x=%d, y=%d\n", x, y); // Still 10, 20 swapCorrect(&x, &y); printf("After swapCorrect: x=%d, y=%d\n", x, y); // 20, 10 return 0; }
Arrays as Function Parameters
Arrays are always passed by reference (as a pointer to the first element). The function can modify the original array.
#include <stdio.h> void printArray(int arr[], int n) { // arr[] same as int *arr for (int i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n"); } void doubleArray(int arr[], int n) { for (int i = 0; i < n; i++) arr[i] *= 2; // Modifies ORIGINAL array! } int main() { int nums[] = {1, 2, 3, 4, 5}; printf("Before: "); printArray(nums, 5); doubleArray(nums, 5); printf("After: "); printArray(nums, 5); return 0; }
Returning Multiple Values via Pointers
A function can only return ONE value. But using pointers, you can "return" multiple values.
#include <stdio.h> void minMax(int arr[], int n, int *minVal, int *maxVal) { *minVal = *maxVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < *minVal) *minVal = arr[i]; if (arr[i] > *maxVal) *maxVal = arr[i]; } } int main() { int arr[] = {85, 32, 97, 45, 11, 78}; int n = 6, minV, maxV; minMax(arr, n, &minV, &maxV); printf("Min = %d, Max = %d\n", minV, maxV); return 0; }
Summary
| Feature | Pass by Value | Pass by Reference |
|---|---|---|
| What is passed | Copy of the value | Address (pointer) of variable |
| Original modified? | ❌ No | ✅ Yes |
| Syntax (caller) | func(x) | func(&x) |
| Syntax (function) | void f(int n) | void f(int *n) |
| Arrays | — | Always by reference automatically |
- Default in C is pass by value — function gets a copy
- Use pass by reference (pointers) when you want to modify the original
- Arrays are always passed by reference (as pointer to first element)
- Pass pointers to "return" multiple values from a function
Frequently Asked Questions
What are function arguments in C?
add(3, 5), the arguments 3 and 5 become the parameters inside the add function.What is the difference between arguments and parameters?
What is call by value in C?
How do you pass an array to a function in C?
Can a C function return a value?
return statement sends that value to the caller. A function declared void returns nothing, while one declared int returns an integer.