Introduction to C Programming

Part 10: Using Pointers for Variable Parameters

by Marshall Brain , brain@iftech.com
Interface Technologies, Inc.
(800) 224-4965, http://www.iftech.com, support@iftech.com
© Copyright 1995 by Marshall Brain. All rights reserved.
Version 2.0, 2/14/95
These tutorials are excerpted from the book "Motif Programming: The Essentials and More" , by Marshall Brain.

Most C programmers first need to use pointers for variable parameters. Suppose you have a simple procedure in Pascal that swaps two integer values:


program samp;  

var  

    a,b:integer; 

 

procedure swap(var i,j:integer);    

var t:integer;    

begin      

    t:=i;      

    i:=j;      

    j:=t;    

end; 

  

begin    

    a:=5;    

    b:=10;    

    writeln(a,b);    

    swap(a,b);    

    writeln(a,b);  

end. 

Because this code uses variable parameters, it swaps the values a and b correctly.

C has no formal mechanism for passing variable parameters: It passes everything by value. Enter and execute the following code and see what happens:


#include <stdio.h>   

 

void swap(int i, int j)    

{    

    int t; 

    

    t=i;    

    i=j;    

    j=t;  

} 

 

void main()  

{    

    int a,b; 

    

    a=5;  

    b=10;    

    printf("%d %d\n",a,b);    

    swap(a,b);    

    printf("%d %d\n",a,b);  

} 

No swapping takes place. The values of a and b are passed to swap, but no values are returned.

To make this function work correctly, you must use pointers, as shown below:


#include <stdio.h>   

 

void swap(int *i, int *j)    

{    

    int t; 

    t = *i;    

    *i = *j;    

    *j = t;  

} 

 

void main()  

{    

    int a,b; 

    a=5;    

    b=10;    

    printf("%d %d\n",a,b);    

    swap(&a,&b);    

    printf("%d %d\n",a,b);  

} 

To get an idea of what this code does, print it out, draw the two integers a and b, and enter 5 and 10 in them. Now draw the two pointers i and j, along with the integer t. When swap is called, it is passed the addresses of a and b. Thus, i points to a (draw an arrow from i to a) and j points to b (draw another arrow from b to j). Because the pointers have been established, *i is another name for a, and *j is another name for b. Now run the code in swap. When the code uses *i and *j, it really means a and b. When the function completes, a and b have been swapped.

Suppose you accidentally forget the & when the swap function is called, and that the swap line accidentally looks like this: swap(a,b);. This causes a segmentation fault. When you leave out the &, the value of a is passed instead of its address. Therefore, i points to an invalid location in memory and the system crashes when *i is used.

This is also why scanf crashes if you forget &--- scanf is using pointers to put the value it reads back into the variable you have passed. Without &, scanf is passed a bad address and crashes.