Existen dos operadores unarios que están directamente relacionados con el uso de punteros: el operador * y el operador &. Un operador indirectamente relacionado sería sizeof.
*expresión
Al ser aplicado a un puntero permite acceder a la variable a la que apunta, pudiendo tomar su valor o modificarlo. La expresión debe ser un puntero o devolver la dirección de una variable. Si expresión es del tipo "T *", "*expresión" devuelve una variable de tipo T.
Es frecuente confundir el uso de "*" para definir punteros y el uso de "*" para acceder a los datos a los que apunta. Cuando se usa el "*" en una declaración de tipo, nos está indicando que la variable que definimos o declaramos a continuación es un puntero. Cuando empleamos "*" antes de un puntero en una expresión de una instrucción a ejecutar, estamos indicando que no queremos acceder al puntero sino a la variable a la que apunta el puntero.
El operador & devuelve la dirección de lo que sigue a continuación. Este operador se puede aplicar a una variable simple o a una expresión relativa a un componente de una estructura más compleja, como por ejemplo el elemento de un vector o un campo de una estructura. El operador devuelve un valor del tipo "T *", siendo T el tipo de la variable o expresión a la que se aplica. Este operador realiza la operación contraria al "*" sobre un puntero, o sea, la expresión "*(&variable)" equivale a la "variable" y la expresión "&(*puntero)" es equivalente a "puntero". El uso más frecuente de este operador es asignar la dirección de una variable a un puntero.
El procedimiento duplicaVector duplica el valor de cada uno de los elementos del vector.
void duplicaVector(int v[], int n){ int *pi=&v[0]; /* Se usa * para definir un puntero a un entero y & para que devuelva la dirección de v[0] */ for(;pi<&v[n];pi++) /* Se multiplica por dos cada elemento del vector */ (*pi)*=2; /* Se usa * para acceder al dato al que apunta pi y el operador aritmético * para multiplicar dos enteros */ }