Copiado directamente de K & R.


	int x = 1, y = 2, z[10];
	int *ip; /* ip es un puntero a int */

	//Se usa &var para referenciar a la dirección de la variable a la que se quiere apuntar
	ip = &x; /* ip apunta a x */

	//Se usa *puntero para referenciar el valor de la dirección a la que apunta el puntero
	y = *ip; /* y es ahora 1 ( el valor de x) */

	*ip = 0; /* x es ahora 0 */

	ip = &z[0]; /* ip ahora apunta a z[0] */

Un ejemplo de una función que toma punteros como parámetros


void swap( int *px, int *py) {
	int temp;

	temp = *px;

	*px = *py;

	*py = temp;
}

Llamando a la función y pasando los valores por referencia


	swap(&x, &y);

	printf("n");
	printf("%d %dn", x, y);
	//Imprime 1, 0

Que pasa si imprimo un puntero directamente sin usar * ?


....
test1(&x, &y);
....

void test1( int *px, int *py) {
	//Imprime 1 0
	printf("%d %dn", *px, *py);
	//Imprime la dirección de x y casteada a Int
	printf("%d %dn", px, py);
}

Arreglos, Punteros y aritmética de punteros


#include 

int main() {
	int a[10], x;
	int *pa;
	//Relleno el array a con [0-9]
	for( x=0; x<10; x++ ) {
		a[x] = x;
		printf("%dn", a[x]);
	}

	pa = &a[0];
	//pa es ahora un puntero que apunta a la primer dirección del arreglo

	printf("%d %dn", a[7], *(pa+7) );
	//Imprime 7 7.. porque luego de pa= &a[0], a[i] es igual a *(pa + i)
}

Punteros y funciones


//Toma como parámetro 2 punteros a char
int strlen( char *s, char *t) {
	while((*s++ = *t++) != '');
}
....

//Función que devuelve un apuntador a int
int *f();

Referencias

The C Programming Language, Segunda Edición; Kernighan, Ritchie; Prentice Hall Hispanoamerica, 1991