Function Arguments & Return
Written and reviewed by Gagan Bhardwaj · Senior IT Faculty · 15+ years’ experience
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.
C always passes arguments by value. If you pass an integer, the integer value is copied. If you pass an address, the pointer value is copied; dereferencing that pointer allows the function to access the caller's object. Textbooks often call the second pattern “pass by reference,” but C has no separate reference-parameter mechanism.
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.
Pointer Arguments (Address Passed by Value)
Pass the variable's address. The function receives a copy of that address and can modify the original object by dereferencing the pointer. This technique is commonly described informally as pass by reference.
#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 addresses; pointer values are copied 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
In a function parameter declaration, an array parameter is adjusted to a pointer to its first element. The pointer is passed by value, the complete array is not copied, and writes through that pointer can modify the caller's array. Pass the element count separately because the function does not automatically know the array length.
#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 | Ordinary value argument | Pointer argument |
|---|---|---|
| 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 | Complete array is not copied | Array parameter adjusts to pointer |
- C always passes by value — including when that value is a pointer
- Pass an address and dereference the pointer when a function must modify the caller's object
- An array parameter is adjusted to a pointer; pass its length separately
- Pass pointers to "return" multiple values from a function
Authoritative References
- Function declarations and parameters — cppreference
- Array declarations and parameter adjustment — cppreference
- Function parameters — GNU C Language Manual
References reviewed on 14 August 2026. Programs and explanations are original teaching material.
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?
Does C support true pass by reference?
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.