Punteros Explicacion Resumida Exp 2do Parcial PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 16

PUNTEROS

Un tema muy ligado al uso de arreglos y paso de


parámetros por referencia a funciones, es el uso de
punteros.
Un puntero, es una variable que contiene la
dirección de memoria, de un dato o de otra
variable que contiene al dato. (El puntero apunta
al espacio físico donde está el dato de la variable).
Puntero
3
El contenido es 1000
una dirección
de memoria
Antes de continuar es importante recordar aspectos
como los siguientes:

memoria dato

3
Espacio de
almacenamiento

Toda variable tiene:


• nombre (identificador),
• tipo de dato, que permite reservar un espacio de
almacenamiento (dirección de memoria) y
• contenido .
El programador al realizar la declaración de la variable, reserva un
espacio de almacenamiento en memoria, conoce el nombre, pero el
Sistema Operativo (S.O.) es quien asigna la dirección de memoria.

Ejemplo: Reserva 16 bits de memoria


Permite referenciar ese espacio
Tipo de dato nombre de memoria en el código

int Edad; //declaración de la variable


Edad = 28; //asignación del valor

valor

El S.O. encuentra
una espacio libre de contenido
memoria y la asocia Edad 3
con el nombre de la Dirección de memoria
nombre 1000
variable. de la variable
Un puntero puede apuntar a un objeto de cualquier
tipo, incluyendo variables simples, arreglos,
estructuras, funciones, etc.
A= 3

Puntero
3 Puntero
*p
*q
1000
5000
‘C’

Por esa razón su contenido es una


dirección de memoria y no un valor
cualquiera.
Las variables tienen nombre, contenido y
dirección de memoria.

edad
&p 3
1000
1000
*q
200
letra
5000
‘C’
300
5000
Al hablar de puntero, se distinguen dos
operadores:

- operador dirección de: &


el cual devuelve como resultado la
dirección de su operando.

- operador de indirección: *
toma el contenido de su operando como
una dirección y nos da como resultado el
contenido en esa dirección.
NOTA: Los operadores unarios * y & tienen mayor
precedencia que los operadores aritméticos +, –, *, /,
% e igual precendencia que ++ y --.
Mayor ( ) [ ] -> .
! ~ ++ -- - (tipo) * & sizeof
*/%
+-
<< >>
< <= > =>
== !=
&
^
|
&&
||
?:
= += -= *= /= etc.
Menor ,
Declaración de un puntero:
Un puntero se declara precediendo el identificador
que referencia al puntero, por el operador de
indirección ( * ), el cual significa “puntero a”.

La declaración de un puntero tiene la siguiente


sintaxis:
tipo *var_puntero (nombre_puntero);
donde
tipo.- especifica el tipo de objeto apuntador, puede
ser cualquier tipo, incluyendo tipos agregados.
var_puntero.- nombre de la variable.
Ejemplo: se declaran dos variables simples:

int edad; edad letra


char letra; 1000 5000

Al declarar los punteros para que apunten a estas variables,


estos deben ser del mismo tipo de dato que la variable a la
que apuntarán.
int *p; /*declara p como puntero a un entero*/ char *q;
/*declara q como puntero a una cadena
de caracteres*/ *p *q

200 300
Para asignar valores a variables simples, podemos emplear el
operador de asignación (=) o la lectura del valor mediante
una función de lectura por teclado (por ejemplo: scanf)
//asigna un valor a la variable edad letra
edad = 3;
3 C
letra = ‘C’; 1000 5000

Para asignar contenido a un PUNTERO, podemos emplear


el operador de asignación (=) en conjunto con el operador de dirección
(&). Pero NUNCA lea el contenido de una variable puntero con una
función de lectura por teclado (por ejemplo: scanf)
//asigna la dirección de memoria de la variable al puntero
*p edad *q letra
p = &edad;
q = &letra ; 3 ‘C’
1000 5000
1000 5000
200 300 11
Reuniendo el código tenemos:
int edad, *p;
char letra, *q;
//Las asignaciones siguientes son correctas
edad = 3;
letra = ‘C’;
p = &edad; /*al puntero ‘p’ le asigna la dirección de memoria
de la variable edad. La cual es conocida por el
sistema operativo.*/
q = &letra;
//Las asignaciones siguientes son incorrectas:
p = 5; /*no puedo asignarle un valor cualquiera a un puntero,
solo direcciones de otra variable del mismo tipo*/
p = &letra; /*no puedo asignarle la dirección de una
variable de otro tipo de dato distinto al cual se declaro
el puntero.*/
Para obtener el valor del dato al cual apunta el puntero, se
emplea el operador de indirección (*) junto al nombre del
puntero. Si solo se pone el nombre del puntero, lo que se
obtiene es el contenido de la variable puntero, es decir, una
dirección de memoria. *p edad
1000 3
*p se puede leer como sigue: 200 1000

➢ toma el contenido del puntero ‘p’ (dirección 1000),


y dame el contenido que se encuentra en esa
dirección de memoria (3).
➢ dame el contenido que se encuentra en la dirección
de memoria que contiene la variable p.
➢ dame el contenido de la dirección de memoria a la
que apunta p.
Por lo tanto, para obtener el contenido de la
*p
variable ‘edad’, es decir el 3, usando el puntero,
debe escribirse *p, con lo que podemos accesar 1000
200 edad
indirectamente al contenido que apunta el puntero
3
‘p’.
1000

Al escribir el código: *p edad


1000 4
edad = *p + 1; 200 1000

Toma indirectamente el contenido de la dirección de memoria a


la que apunta ‘p’, es decir, el contenido de la variable ‘edad’ y le
suma un uno y luego lo asigna a la variable edad (lo que hace es
3+1→ 4) . Es lo mismo que escribir:
edad = edad + 1; si las variables ‘p’ y ‘edad’ se declararón
en la misma función.
El código:
*p = 1; Lo que hace es asignar
indirectamente un 1 al
*p edad contenido de la dirección de
1000 1 memoria a la que apunta ‘p’,
200 1000 es decir, a la variable ‘edad’.

Si lo que se quiere es leer el valor de una variable mediante


un puntero, se debe recordar que al usar la variable scanf,
el segundo argumento que requiere es una dirección de
memoria de una variable, y que el puntero en si, ya
contiene una dirección de memoria de una variable.
Así el código:

scanf(“%d”, &edad);

El ampersand(&), permite obtener la dirección de


memoria de la variable edad. Al no ser puntero, el
colocar el ampersand esto es correcto.

scanf(“%d”, p);
En el caso de leer indirectamente mediante el
puntero, el uso del ampersand es incorrecto, ya
que el contenido del puntero en si es la dirección de
memoria donde se ubica la variable edad. Al ser
puntero, el colocar el ampersand esto sería
incorrecto.
Los punteros se pueden utilizar para:

• Crear y manipular estructuras de datos,


• Asignar memoria dinámicamente, y
• Proveer el paso de parámetros por
referencia en las llamadas a funciones.

También podría gustarte