The second edition of "Developing Professional Applications in Windows 95 and Windows NT Using MFC" is now available. This book is filled with tons of great examples and code to get you up and running with VC++ 4.2 and beyond! See the book description and TOC for more information. Order online from amazon.com
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.





