Está en la página 1de 27

ING. José Félix.

CORREO: jmanfelix@gmail.com

Juan 8:32 y conoceréis la verdad, y la verdad os


hará libres.
 Un puntero es una variable que contiene la
dirección de memoria de un dato o de otra
variable que contiene al dato en un arreglo.
Esto quiere decir, que el puntero apunta al
espacio físico donde está el dato o la variable.
Un puntero puede apuntar a un objeto de
cualquier tipo, como por ejemplo, a una
estructura o una función.
 Muchas de las funciones estándares de C,
trabajan con punteros, como es el caso del
scanf o strcpy. Estas funciones reciben o
devuelve un valor que es un puntero. Por
ejemplo: A scanf se le pasa la dirección de
memoria del dato a leer...
 Muchas de las funciones estándares de C,
trabajan con punteros, como es el caso del
scanf o strcpy. Estas funciones reciben o
devuelve un valor que es un puntero. Por
ejemplo: A scanf se le pasa la dirección de
memoria del dato a leer...

 En este caso se le pasa la dirección de memoria de


la variable a, la cual tiene reservado un espacio en
la memoria por el compilador.
 Un puntero es una variable que guarda la
dirección de memoria de otra variable, haciendo
lógica a esto, decimos que un puntero se declara
igual que cualquier otra variable, pero
anteponiendo un * (asterisco) antes del nombre
de la variable.
 Su sintaxis sería:
tipo *NombrePuntero;
 Donde tipo es el tipo de dato al que referenciará
este puntero, es decir, que si se necesita guardar
la dirección de memoria de un dato int, se
necesita un puntero de tipo int.
Anteriormente poníamos algunos ejemplos de como
asignar la dirección de memoria a un puntero y de
como acceder al valor de este.

Operador de Dirección (&): Este nos permite acceder a


la dirección de memoria de una variable.

Operador de Indirección (*): Además de que nos


permite declarar un tipo de dato puntero, también nos
permite ver el VALOR que está en la dirección asignada.

Incrementos (++) y Decrementos (--): Se visualizara


que puedes usar un puntero como si de un array se
tratase, es por esto que permite estos operadores.
De lo anterior podemos decir que:

int a;
int *puntero=&a;
printf("%d",a);
Es Igual printf("%d",*puntero);
Un puntero nos permite sumar o restar números
enteros, pero su funcionamiento ahora es de
posiciones, es decir que nos permitirá movernos a
la siguiente dirección de memoria.

A un puntero no se le puede realizar


multiplicaciones, divisiones, sumas o restas con
otro puntero o con un valor de tipo coma flotante
(float, double...). Esto es por que un puntero no es
un valor, sólo es una dirección.

En un puntero se pueden realizar varias


operaciones de tipo enteras, pero en dependencia
de como se usen, sus resultados pueden ser muy
diferentes
 Los vectores son punteros constantes. Un
vector sin subindice es un puntero al primer
elemento del vector. Una matriz es un vector
de vectores. (Ej: int M[3][3];) de manera que
en cada elemento del primer vector "se
cuelga" otro vector, pudiendo hacer así
referencia a filas y columnas.
 Ejemplo arreglo par.
 Ejercicio:
Desarrollar un programa utilizando el concepto
de arreglos y punteros que permita capturar n
cantidad de números a través de consola y
determinar cual es el menor elemento y su
dirección de memoria.
 Se menciona que una matriz es una secuencia de
espacios en memoria, que nos permitían alojar
datos en cada uno y un puntero es una variable
que guarda la dirección de memoria, también se
dice como recorre las direcciones de memoria
con los operadores ++ y --.
 Aquí veremos como puede usarse un puntero
como si de una matriz se tratase, luego de que
veas que es técnicamente lo mismo, te
preguntaras por que usar punteros, pero estos
son muy necesarios y únicos que nos permiten
realizar cosas que con un array normal, no se
puede, como asignarle memoria dinámica, etc...
 Se Habra notado que se ha usado *(puntero+i),
así como explica la sección de operaciones
aritméticas, pero también podemos acceder de
otras maneras como lo son:
 array[i] => Accede como un array normal
 *(array+i) => También accede como un array
normal.
 puntero[i] => Accedemos al valor de puntero sub
i
 *(puntero+i) => Accedemos al valor de puntero
+ i.
 Se ha visto el uso que se le puede dar a un
puntero como si de un array se tratase,
entonces usando esta misma lógica podemos
hacer un array de caracteres usando
punteros.
 Sin embargo al tratarse de una constante de
caracteres no podemos modificarla despues
de definir sus valores. Como por ejemplo no
podemos remplazar un carácter, o leer un
nuevo valor.
 Para poder modificar el valor de este puntero,
este tendría que apuntar a una dirección que
no sea una constante, como un array.

 notar que si se pudo remplazar el valor del


nombre, pero aun la cantidad de caracteres
esta limitada por el array original.
Memoria dinámica: new y delete
La memoria dinámica es un espacio de
almacenamiento que se puede solicitar en
tiempo de ejecución. Además de solicitar
espacios de almacenamiento, también
podemos liberarlos (en tiempo de ejecución)
cuando dejemos de necesitarlos.
Para realizar esta administración de la memoria
dinámica, C++ cuenta con dos
operadores new y delete. Antes de utilizarlos,
debemos incluir el encabezado <new>.
 El operador new reserva memoria dinámica
de cualquier tipo, esto es:
 tipos primitivos (int, double, etc)
 tipos definidos por el usuario (clases o
estructuras).
delete se usa para liberar la memoria dinámica
reservada con new.
 La expresión será normalmente un puntero,
el operador delete[] se usa para liberar
memoria de arrays dinámicos.
 Es importante liberar siempre
usando delete la memoria reservada con new.
Existe el peligro de pérdida de memoria si se
ignora esta regla.
A continuación se muestra un ejemplo de
como intercambiar la dirección de una variable
a otra.
A continuación se muestra un ejemplo de
como pasar la dirección de memoria de un
arreglo a una función, y a su vez como recorrer
cada uno de los valores que contienen las
direcciones de memoria (no el arreglo) para
saber cual es el elemento mayor.
Para que un puntero se asigne a una matriz se
utiliza un puntero de punteros:
**puntero_matriz
Por ejemplo:
 **puntero_matriz significa que va a señalar al
puntero_fila (1, 4, 7)
 Puntero_fila señala a sus correspondientes
columnas: (2,3), (5,6), (8,9)
 C++ permite declarar punteros a miembros
de clases, estructuras y uniones.
 La sintaxis para la declaración de un puntero
a un miembro es la siguiente:
 <tipo> <clase|estructura|unión>::*<identificador>;

 De este modo se declara un puntero


"identificador" a un miembro de tipo "tipo" de
la clase, estructura o unión especificada.
Asignación de valores a punteros a miembro
 Una vez declarado un puntero, debemos
asignarle la dirección de un miembro del tipo
adecuado de la clase, estructura o unión.
Podremos asignarle la dirección de cualquiera
de los miembros del tipo adecuado. La
sintaxis es:
<identificador> = &<clase|estructura|unión>::<campo>;
Operadores .* y ->*
Se trata de dos variantes del mismo operador, uno para objetos
y otro para punteros:
<objeto>.*<puntero>
<puntero_a_objeto>->*<puntero>
 La primera forma se usa cuando tratamos de acceder a un
miembro de un objeto.
 La segunda cuando lo hacemos a través de un puntero a un
objeto.

También podría gustarte