Tutorial - Understanding Pointers in C - Part 4
Tutorial
This is the fourth part of the tutorial on Pointers in C. Please read Parts 1 ,2 and 3 before continuing this tutorial.
Compiled from multiple sources on the internet. Note that address values will change depending on the programming platform and operating system
C - Pointers Continued
1. Functions Pointers Example
For example, the next program swaps two values of two:
void swap (int *a, int *b);
int main()
{
int m = 25;
int n = 100;
printf("m is %d, n is %d\n", m, n);
swap(&m, &n);
printf("m is %d, n is %d\n", m, n);
return 0;
}
void swap (int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
Output:
m is 25, n is 100
m is 100, n is 25
Explanation:
- The program swaps the actual variables values because the function accesses them by address using pointers.
We declare the function responsible for swapping the two variable values, which takes two integer pointers as parameters and returns any value when it is called.
In the main function, we declare and initialize two integer variables ('m' and 'n') then we print their values respectively.
We call the swap() function by passing the address of the two variables as arguments using the ampersand symbol. After that, we print the new swapped values of variables.
Here we define the swap() function content which takes two integer variable addresses as parameters and declare a temporary integer variable used as a third storage box to save one of the value variables which will be put to the second variable.
Save the content of the first variable pointed by 'a' in the temporary variable.
Store the second variable pointed by b in the first variable pointed by a.
Update the second variable (pointed by b) by the value of the first variable saved in the temporary variable.
2. Functions with Array Parameters
In C, we cannot pass an array by value to a function. Whereas, an array name is a pointer (address), so we just pass an array name to a function which means to pass a pointer to the array.
For example, we consider the following program:
#include<stdio.h>
int add_array (int *a, int num_elements);
int main()
{
int Tab[5] = {100, 220, 37, 16, 98};
printf("Total summation is %d\n", add_array(Tab, 5));
return 0;
}
int add_array (int *p, int size)
{
int total = 0;
int k;
for (k = 0; k < size; k++)
{
total += p[k]; /* it is equivalent to total +=*p ;p++; */
}
return (total);
}
Output:
Total summation is 471
Explanation:
We declare and define add_array() function which takes an array address( pointer) with its elements number as parameters and returns the total accumulated summation of these elements. The pointer is used to iterate the array elements (using the p[k] notation), and we accumulate the summation in a local variable which will be returned after iterating the entire element array.
We declare and initialize an integer array with five integer elements. We print the total summation by passing the array name (which acts as address) and array size to the add_array()called function as arguments.
3. Functions that Return an Array
In C, we can return a pointer to an array, as in the following program:
#include <stdio.h>
int * build_array();
int main()
{
int *a;
a = build_array(); /* get first 5 even numbers */
for (k = 0; k < 5; k++)
printf("%d\n", a[k]);
return 0;
}
int * build_array()
{
static int Tab[5]={1,2,3,4,5};
return (Tab);
}
Output:
1
2
3
4
5
Explanation
We define and declare a function which returns an array address containing an integer value and didn't take any arguments.
We declare an integer pointer which receives the complete array built after the function is called and we print its contents by iterating the entire five element array.
- Notice that a pointer, not an array, is defined to store the array address returned by the function. Also notice that when a local variable is being returned from a function, we have to declare it as static in the function.
4. Function Pointers
As we know by definition that pointers point to an address in any memory location, they can also point to at the beginning of executable code as functions in memory.
A pointer to function is declared with the * ,the general statement of its declaration is:
return_type (*function_name)(arguments)
You have to remember that the parentheses around (*function_name) are important because without them, the compiler will think the function_name is returning a pointer of return_type.
After defining the function pointer, we have to assign it to a function. For example, the next program declares an ordinary function, defines a function pointer, assigns the function pointer to the ordinary function and after that calls the function through the pointer:
#include <stdio.h>
void Hi_function (int times); /* function */
int main()
{
void (*function_ptr)(int); /* function pointer Declaration */
function_ptr = Hi_function; /* pointer assignment */
function_ptr (3); /* function call */
return 0;
}
void Hi_function (int times)
{
int k;
for (k = 0; k < times; k++)
printf("Hi\n");
}
Output:
Hi
Hi
Hi
Explanation:
We define and declare a standard function which prints a Hi text k times indicated by the parameter times when the function is called
We define a pointer function (with its special declaration) which takes an integer parameter and doesn't return anything.
We initialize our pointer function with the Hi_function which means that the pointer points to the Hi_function().
Rather than the standard function calling by taping the function name with arguments, we call only the pointer function by passing the number 3 as arguments, and that's it!
Keep in mind that the function name points to the beginning address of the executable code like an array name which points to its first element. Therefore, instructions like function_ptr = &Hi_function and (*funptr)(3) are correct.
NOTE: It is not important to insert the address operator & and the indirection operator * during the function assignment and function call.
5. Array of Function Pointers
An array of function pointers can play a switch or an if statement role for making a decision, as in the next program:
#include <stdio.h>
int sum(int num1, int num2);
int sub(int num1, int num2);
int mult(int num1, int num2);
int div(int num1, int num2);
int main()
{
int x, y, choice, result;
int (*ope[4])(int, int);
ope[0] = sum;
ope[1] = sub;
ope[2] = mult;
ope[3] = div;
printf("Enter two integer numbers: ");
scanf("%d%d", &x, &y);
printf("Enter 0 to sum, 1 to subtract, 2 to multiply, or 3 to divide: ");
scanf("%d", &choice);
result = ope[choice](x, y);
printf("%d", result);
return 0;
}
int sum(int x, int y)
{
return(x + y);
}
int sub(int x, int y)
{
return(x - y);
}
int mult(int x, int y)
{
return(x * y);
}
int div(int x, int y)
{
if (y != 0)
return (x / y);
else
return 0;
}
Output:
Enter two integer numbers: 13 48
Enter 0 to sum, 1 to subtract, 2 to multiply, or 3 to divide: 2
624
Explanation:
We declare and define four functions which take two integer arguments and return an integer value. These functions add, subtract, multiply and divide the two arguments regarding which function is being called by the user.
We declare 4 integers to handle operands, operation type, and result respectively. Also, we declare an array of four function pointer. Each function pointer of array element takes two integers parameters and returns an integer value.
We assign and initialize each array element with the function already declared. For example, the third element which is the third function pointer will point to multiplication operation function.
We seek operands and type of operation from the user typed with the keyboard.
We called the appropriate array element (Function pointer) with arguments, and we store the result generated by the appropriate function.
The instruction int (*ope4)(int, int); defines the array of function pointers. Each array element must have the same parameters and return type.
The statement result = opechoice; runs the appropriate function according to the choice made by the user The two entered integers are the arguments passed to the function.
These are a few strategies to exploit pointers to use in combination with functions for efficient programming.
Try out all these examples along with the ones discussed in class. Can you also exploit pointers for better programming? Experiment your programs on the HPOJ IDE.
Comments