Professional Documents
Culture Documents
eclaracin
tipo * variable;
Por ejemplo:
int* puntero;
Se dice que la variable puntero es un puntero a enteros (apunta a
un entero).
Asignacin
puntero = &variable;
Desreferencia de un puntero
*puntero = 45;
if (princPunt == finPunt)
cout << " Esto no puede suceder " << '\n';
cout << "Numero de elementos \t" <<finPunt-princPunt << '\n';
}
int (*puntero_a_una_funcin)(char)
Para extraer el tipo de la declaracin de funcin hemos hecho lo siguiente:
1.
2.
3.
Como el uso de tipos de funciones es poco legible, se suele casi siempre definir un tipo de funcin
mediante un typedef. Esto lo hacemos aqu tambin.
2
3
5
6
7
8
9
10
11
// Error
int (*direccin_de_una_funcin)(char) =
Esta lnea hara algo como delcarar una_funcin y asignar su direccin al mismo instante. Esto no
est permitido.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Que se puede llamar a una funcin con dos sintxis diferentes es un tanto peculiar, ya que
suele haber una diferencia importante entre en un puntero y un puntero dereferenciado. Pero
compilan los dos.
La pregunta es: ?cul de las dos formas es la preferible? Pues, es cuestin de gusto. Yo prefiero la
forma (*puntero_a_una_funcin)() ya que deja ms claro que punter_a_una_funcin el el
nombre de una variable y no de una funcin.
Como C y C++ permiten conversiones entre todo tipo de punteros, se puedenconvertir tambin los
punteros de funciones a punteros de variables.
4
5
puntero_a_datos[5] = 0xFF;
Es obvio, que estas conversiones son ideales para hackers, pero ser poco probable que se necesitan
durante un uso normal del lenguaje. Por eso puedes esperar que el compilador te avisar con
insistencia. Adems, el cdigo ejecutable de una funcin es de slo lectura. O debera. Conseguir
asignar algo a la memoria del cdigo ejecutable es una manera excelente para introducir un error que
no se encontrar hasta que alguien intente llamar a esta funcin.
void t(int*) {}
int main() {
int x = 0;
int* ip = &x;
const int* cip = &x;
t(ip);
//!
// OK
t(cip); // Not OK
u(ip);
// OK
u(cip); // Also OK
//!
*w() = 1; // Not OK
} ///:~
Los punteros tienen muchas utilidades; por ejemplo, nos permiten pasar
argumentos (o parmetros) a una funcin y modificarlos. Tambin permiten el manejo
de cadenas y de arrays. Otro uso importante es que nos permiten acceder directamente
a la pantalla, al teclado y a todos los componentes del ordenador. Si slo sirvieran
para almacenar direcciones de memoria no seran de mucha utilidad. Nos deben dejar
tambin la posibilidad de acceder al contenido de esas posiciones de memoria. Para
ello se usa el operador * (operador de indireccin), que no hay que confundir con el
de la multiplicacin.