c
examples
examples.c🔧c
/**
* @file examples.c
* @brief Function Parameters and Arguments Examples
*
* This file demonstrates parameter passing in C.
*
* Compile: gcc -Wall examples.c -o examples
* Run: ./examples
*/
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
/* ============================================================
* EXAMPLE 1: PASS BY VALUE - BASIC TYPES
* ============================================================ */
void modifyValue(int n) {
printf(" Inside function (before): n = %d\n", n);
n = n * 2; // Modifies local copy
printf(" Inside function (after): n = %d\n", n);
}
void example_pass_by_value() {
printf("\n=== Example 1: Pass by Value ===\n");
int x = 10;
printf("Before call: x = %d\n", x);
modifyValue(x);
printf("After call: x = %d (unchanged!)\n", x);
}
/* ============================================================
* EXAMPLE 2: MULTIPLE PARAMETERS
* ============================================================ */
int calculateRectangle(int length, int width) {
return length * width;
}
float calculateBMI(float weight, float height) {
return weight / (height * height);
}
void example_multiple_params() {
printf("\n=== Example 2: Multiple Parameters ===\n");
int area = calculateRectangle(5, 3);
printf("Rectangle 5x3 area: %d\n", area);
float bmi = calculateBMI(70.0f, 1.75f);
printf("BMI (70kg, 1.75m): %.2f\n", bmi);
}
/* ============================================================
* EXAMPLE 3: ARRAY PARAMETERS
* ============================================================ */
void printArray(int arr[], int size) {
printf("[");
for (int i = 0; i < size; i++) {
printf("%d", arr[i]);
if (i < size - 1) printf(", ");
}
printf("]\n");
}
int sumArray(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
void example_array_params() {
printf("\n=== Example 3: Array Parameters ===\n");
int numbers[] = {10, 20, 30, 40, 50};
int size = sizeof(numbers) / sizeof(numbers[0]);
printf("Array: ");
printArray(numbers, size);
printf("Sum: %d\n", sumArray(numbers, size));
}
/* ============================================================
* EXAMPLE 4: MODIFYING ARRAY ELEMENTS
* ============================================================ */
void doubleElements(int arr[], int size) {
for (int i = 0; i < size; i++) {
arr[i] *= 2; // Modifies original!
}
}
void example_modify_array() {
printf("\n=== Example 4: Modifying Arrays ===\n");
int numbers[] = {1, 2, 3, 4, 5};
int size = 5;
printf("Before: ");
printArray(numbers, size);
doubleElements(numbers, size);
printf("After doubling: ");
printArray(numbers, size);
}
/* ============================================================
* EXAMPLE 5: SIMULATING PASS BY REFERENCE
* ============================================================ */
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void increment(int *n) {
(*n)++;
}
void example_pass_by_reference() {
printf("\n=== Example 5: Pass by Reference (using pointers) ===\n");
// Swap example
int x = 10, y = 20;
printf("Before swap: x=%d, y=%d\n", x, y);
swap(&x, &y);
printf("After swap: x=%d, y=%d\n", x, y);
// Increment example
int count = 5;
printf("\nBefore increment: count=%d\n", count);
increment(&count);
printf("After increment: count=%d\n", count);
}
/* ============================================================
* EXAMPLE 6: CONST PARAMETERS
* ============================================================ */
int calculateSum(const int arr[], int size) {
// arr[0] = 0; // Would cause error - arr is const
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
int stringLength(const char *str) {
int len = 0;
while (str[len] != '\0') {
len++;
}
return len;
}
void example_const_params() {
printf("\n=== Example 6: const Parameters ===\n");
int numbers[] = {1, 2, 3, 4, 5};
printf("Sum (const protected): %d\n", calculateSum(numbers, 5));
const char *message = "Hello, World!";
printf("String length: %d\n", stringLength(message));
}
/* ============================================================
* EXAMPLE 7: STRING PARAMETERS
* ============================================================ */
void printGreeting(char name[]) {
printf("Hello, %s!\n", name);
}
void makeUppercase(char str[]) {
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] >= 'a' && str[i] <= 'z') {
str[i] = str[i] - 32;
}
}
}
void example_string_params() {
printf("\n=== Example 7: String Parameters ===\n");
printGreeting("Alice");
printGreeting("Bob");
char text[] = "Hello World";
printf("Original: %s\n", text);
makeUppercase(text);
printf("Uppercase: %s\n", text);
}
/* ============================================================
* EXAMPLE 8: 2D ARRAY PARAMETERS
* ============================================================ */
void printMatrix(int matrix[][3], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 3; j++) {
printf("%3d ", matrix[i][j]);
}
printf("\n");
}
}
int matrixSum(int matrix[][3], int rows, int cols) {
int sum = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
sum += matrix[i][j];
}
}
return sum;
}
void example_2d_array() {
printf("\n=== Example 8: 2D Array Parameters ===\n");
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
printf("Matrix:\n");
printMatrix(matrix, 2);
printf("Sum: %d\n", matrixSum(matrix, 2, 3));
}
/* ============================================================
* EXAMPLE 9: RETURNING MULTIPLE VALUES VIA POINTERS
* ============================================================ */
void getMinMax(int arr[], int size, int *min, int *max) {
*min = arr[0];
*max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] < *min) *min = arr[i];
if (arr[i] > *max) *max = arr[i];
}
}
void divMod(int dividend, int divisor, int *quotient, int *remainder) {
*quotient = dividend / divisor;
*remainder = dividend % divisor;
}
void example_multiple_returns() {
printf("\n=== Example 9: Multiple Return Values ===\n");
int arr[] = {23, 5, 78, 12, 45, 89, 3};
int size = 7;
int min, max;
getMinMax(arr, size, &min, &max);
printf("Min: %d, Max: %d\n", min, max);
int q, r;
divMod(17, 5, &q, &r);
printf("17 / 5 = %d remainder %d\n", q, r);
}
/* ============================================================
* EXAMPLE 10: VARIADIC FUNCTIONS
* ============================================================ */
int sumAll(int count, ...) {
va_list args;
va_start(args, count);
int sum = 0;
for (int i = 0; i < count; i++) {
sum += va_arg(args, int);
}
va_end(args);
return sum;
}
double average(int count, ...) {
va_list args;
va_start(args, count);
double sum = 0;
for (int i = 0; i < count; i++) {
sum += va_arg(args, double);
}
va_end(args);
return sum / count;
}
void example_variadic() {
printf("\n=== Example 10: Variadic Functions ===\n");
printf("sum(3, 10, 20, 30) = %d\n", sumAll(3, 10, 20, 30));
printf("sum(5, 1, 2, 3, 4, 5) = %d\n", sumAll(5, 1, 2, 3, 4, 5));
printf("avg(3, 10.0, 20.0, 30.0) = %.2f\n",
average(3, 10.0, 20.0, 30.0));
}
/* ============================================================
* EXAMPLE 11: FUNCTION WITH STRUCT PARAMETER
* ============================================================ */
struct Point {
int x;
int y;
};
// Pass by value - struct is copied
void printPointByValue(struct Point p) {
printf("Point: (%d, %d)\n", p.x, p.y);
}
// Pass by pointer - more efficient
void printPointByPointer(const struct Point *p) {
printf("Point: (%d, %d)\n", p->x, p->y);
}
// Modify struct via pointer
void movePoint(struct Point *p, int dx, int dy) {
p->x += dx;
p->y += dy;
}
void example_struct_params() {
printf("\n=== Example 11: Struct Parameters ===\n");
struct Point p = {10, 20};
printf("By value: ");
printPointByValue(p);
printf("By pointer: ");
printPointByPointer(&p);
movePoint(&p, 5, 3);
printf("After move(5,3): ");
printPointByPointer(&p);
}
/* ============================================================
* EXAMPLE 12: FUNCTION POINTER AS PARAMETER
* ============================================================ */
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int multiply(int a, int b) { return a * b; }
int operate(int a, int b, int (*operation)(int, int)) {
return operation(a, b);
}
void example_function_pointer() {
printf("\n=== Example 12: Function Pointer Parameter ===\n");
int a = 20, b = 5;
printf("%d + %d = %d\n", a, b, operate(a, b, add));
printf("%d - %d = %d\n", a, b, operate(a, b, subtract));
printf("%d * %d = %d\n", a, b, operate(a, b, multiply));
}
/* ============================================================
* EXAMPLE 13: ARRAY OF DIFFERENT SIZES
* ============================================================ */
void processData(int *data, int size, const char *name) {
printf("Processing %s (%d elements): ", name, size);
int sum = 0;
for (int i = 0; i < size; i++) {
sum += data[i];
}
printf("sum = %d\n", sum);
}
void example_flexible_array() {
printf("\n=== Example 13: Arrays of Different Sizes ===\n");
int small[] = {1, 2, 3};
int medium[] = {10, 20, 30, 40, 50};
int large[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
processData(small, 3, "small");
processData(medium, 5, "medium");
processData(large, 10, "large");
}
/* ============================================================
* EXAMPLE 14: CALLBACK PATTERN
* ============================================================ */
void forEachElement(int arr[], int size, void (*callback)(int)) {
for (int i = 0; i < size; i++) {
callback(arr[i]);
}
}
void printElement(int n) {
printf("%d ", n);
}
void printSquare(int n) {
printf("%d ", n * n);
}
void example_callback() {
printf("\n=== Example 14: Callback Pattern ===\n");
int numbers[] = {1, 2, 3, 4, 5};
printf("Elements: ");
forEachElement(numbers, 5, printElement);
printf("\n");
printf("Squares: ");
forEachElement(numbers, 5, printSquare);
printf("\n");
}
/* ============================================================
* MAIN FUNCTION
* ============================================================ */
int main() {
printf("╔════════════════════════════════════════════════╗\n");
printf("║ PARAMETERS & ARGUMENTS - EXAMPLES ║\n");
printf("║ Function parameter passing ║\n");
printf("╚════════════════════════════════════════════════╝\n");
example_pass_by_value();
example_multiple_params();
example_array_params();
example_modify_array();
example_pass_by_reference();
example_const_params();
example_string_params();
example_2d_array();
example_multiple_returns();
example_variadic();
example_struct_params();
example_function_pointer();
example_flexible_array();
example_callback();
printf("\n=== All Examples Completed! ===\n");
return 0;
}