La memoria de un PC
Dirección
Contenido
0x0012ff50
0x0012ff51
0x0012ff52
0x0012ff53
0x0012ff54
0x0012ff55
001011001
000000001
011010001
001111110
000111001
000011000
4 bytes
1 byte
La memoria de01 un PC
Notación hexadecimal:
(Base 16)
2
3
4
5
6
7
8
9
a
b
c
d
e
f
10
La memoria de un PC
PARA REFERIRNOS A LA MEMORIA DEL
ORDENADOR, EN EL LENGUAJE C++ UTILIZAMOS
DOS OPERADORES:
OPERADOR DE DIRECCIÓN
&
OPERADOR DE INDIRECCIÓN
*
La memoria de un PC
AL APLICAR EL OPERADOR DE DIRECCIÓN
SOBRE UNA VARIABLE (&a) nos referimos a la
propia dirección de memoria EN DONDE SE
ALOJA LA VARIABLE.
AL APLICAR EL OPERADOR DE
INDIRECCIÓN SOBRE UNA DIRECCIÓN
(*(&a)) nos referimos al contenido de la dirección
de memoria SEÑALADA por (&a).
Ejemplo de alojamiento
de una variable en la memoria
El valor de
&A es:
unsigned int A=0;
0x0012ff50
4 bytes
reservados
para
guardar el
dato
Dirección
Contenido
0x0012ff50
0x0012ff51
0x0012ff52
0x0012ff53
000000000
000000000
000000000
000000000
El valor de A
o de *(&A)
es: 0
Ejemplo de alojamiento
de una variable en la memoria
unsigned int V[2]; V[0]=0; V[1]=4294967295;
8 bytes
reservados
para
guardar los
datos
Dirección
0x0012ff50
0x0012ff51
0x0012ff52
0x0012ff53
0x0012ff54
0x0012ff55
0x0012ff56
0x0012ff57
Contenido
El valor de
00000000
&V[0] es:
00000000
0x0012ff50
00000000
00000000
El valor de
11111111
&V[1] es:
11111111
0x0012ff54
11111111
11111111
El valor de
V[0] es:
0
El valor de
V[1] es:
429…..
Ejemplo de alojamiento
de una variable en la memoria
unsigned int V[2]; V[0]=0; V[1]=4294967295;
8 bytes
reservados
para
guardar los
datos
Dirección
0x0012ff50
0x0012ff51
0x0012ff52
0x0012ff53
0x0012ff54
0x0012ff55
0x0012ff56
0x0012ff57
Contenido
El valor
de
El valor de
00000000
*&V[0]
es:
&*&V[0] es:
00000000
0
0x0012ff50
00000000
00000000
El valor
de
El valor de
11111111
*&V[1]
es:
&*&V[0] es:
11111111
429….
11111111 0x0012ff54
11111111
LOS PUNTEROS
•UN PUNTERO ES UNA VARIABLE DE 4 BYTES QUE
GUARDA UNA DIRECCIÓN DE MEMORIA.
•EL VALOR DE LA DIRECCIÓN DE MEMORIA QUE
GUARDA EL PUNTERO, SE DICE QUE ES EL LUGAR
DE LA MEMORIA AL QUE “APUNTA EL PUNTERO”.
•UN PUNTERO NOS PERMITE MODIFICAR EL
CONTENIDO DE LA DIRECCIÓN DE LA MEMORIA A LA
QUE APUNTA.
•UN PUNTERO CONSIDERA A QUÉ TIPO DE VARIABLE
APUNTA.
•SE PUEDE MODIFICAR EL LUGAR AL QUE APUNTA.
•UN PUNTERO ES ALGO… MUY SERIO.
LOS PUNTEROS
•UN PUNTERO ES UNA VARIABLE DE 4 BYTES
QUE GUARDA UNA DIRECCIÓN DE MEMORIA.
Dirección
Contenido
0x0012ff50
0x0ffa3da
4 bytes
4 bytes
•Forma de declarar un puntero:
int *p;
TIPO DE VARIABLE A LA QUE APUNTA
OPERADOR DE INDIRECCIÓN
NOMBRE DEL PUNTERO
LOS PUNTEROS
•EL VALOR DE LA DIRECCIÓN DE MEMORIA QUE
GUARDA EL PUNTERO, SE DICE QUE ES EL LUGAR
DE LA MEMORIA AL QUE “APUNTA EL PUNTERO”.
int a=9;
Dirección
Contenido
0x0012ff50:53
9
0x0ff34a02:05
0x0012ff50
int *p;
p=&a;
LOS PUNTEROS
•UN PUNTERO NOS PERMITE MODIFICAR EL
CONTENIDO DE LA DIRECCIÓN DE LA MEMORIA A
LA QUE APUNTA. (En realidad es el operador de
indirección de C quien nos lo permite)
Dirección
Contenido
a
0x0012ff50:53
9
p
0x0ff34a02:05
0x0012ff50
*p=6
a
0x0012ff50:53
6
p
0x0ff34a02:05
0x0012ff50
LOS PUNTEROS
•UN PUNTERO CONSIDERA A QUÉ TIPO DE
VARIABLE APUNTA.
unsigned long a=0;
unsigned long *p=&a;
a: 8bytes
Dirección
0x0012ff50
0x0012ff51
0x0012ff52
0x0012ff53
0x0012ff54
0x0012ff55
0x0012ff56
0x0012ff57
Contenido
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
p: 4bytes
0x0a2166f1:f4
0x0012ff50
LOS PUNTEROS
•UN PUNTERO PUEDE MODIFICAR EL LUGAR AL
QUE APUNTA
unsigned int V[2];
V[0]=0;
V[1]= 4294967295;
Dirección del
vector V
0x0012ff50
0x0012ff51
0x0012ff52
0x0012ff53
0x0012ff54
0x0012ff55
0x0012ff56
0x0012ff57
Contenido
00000000
00000000
00000000
00000000
11111111
11111111
11111111
11111111
LOS PUNTEROS
•UN PUNTERO PUEDE MODIFICAR EL LUGAR AL
QUE APUNTA
unsigned int *p;
p=&V[0];
Dirección del
Contenido
puntero p
0x0ff2aa12 0x0012ff50
Dirección del
vector V
0x0012ff50
0x0012ff51
0x0012ff52
0x0012ff53
0x0012ff54
0x0012ff55
0x0012ff56
0x0012ff57
Contenido
00000000
00000000
00000000
00000000
11111111
11111111
11111111
11111111
LOS PUNTEROS
•UN PUNTERO PUEDE MODIFICAR EL LUGAR AL
QUE APUNTA
p=p+1;
Dirección del
Contenido
puntero p
0x0ff2aa12 0x0012ff54
Dirección del
vector V
0x0012ff50
0x0012ff51
0x0012ff52
0x0012ff53
0x0012ff54
0x0012ff55
0x0012ff56
0x0012ff57
Contenido
00000000
00000000
00000000
00000000
11111111
11111111
11111111
11111111
LOS PUNTEROS
•UN PUNTERO PUEDE MODIFICAR EL LUGAR AL
QUE APUNTA
p=p-1;
Dirección del
Contenido
puntero p
0x0ff2aa12 0x0012ff50
Dirección del
vector V
0x0012ff50
0x0012ff51
0x0012ff52
0x0012ff53
0x0012ff54
0x0012ff55
0x0012ff56
0x0012ff57
Contenido
00000000
00000000
00000000
00000000
11111111
11111111
11111111
11111111
LOS PUNTEROS
•UN PUNTERO PUEDE MODIFICAR EL LUGAR AL
QUE APUNTA
*p=4294967295;
Dirección del
Contenido
puntero p
0x0ff2aa12 0x0012ff50
Dirección del
Contenido
vector V
0x0012ff50 11111111
0x0012ff51 11111111
0x0012ff52 11111111
0x0012ff53 11111111
0x0012ff54 11111111
0x0012ff55 11111111
0x0012ff56 11111111
0x0012ff57 11111111
LOS PUNTEROS
•UN PUNTERO PUEDE MODIFICAR EL LUGAR AL
QUE APUNTA
*(p+1)=0;
p[1]=0;
Dirección del
Contenido
puntero p
0x0ff2aa12 0x0012ff50
Dirección del
vector V
0x0012ff50
0x0012ff51
0x0012ff52
0x0012ff53
0x0012ff54
0x0012ff55
0x0012ff56
0x0012ff57
Contenido
11111111
11111111
11111111
11111111
00000000
00000000
00000000
00000000
LOS PUNTEROS
•UN PUNTERO ES ALGO… MUY SERIO.
MEDIANTE EL OPERADOR DE INDIRECCIÓN
TENEMOS LA POSIBILIDAD DE ACTUAR SOBRE:
•Cada PIXEL de la pantalla.
•Las coordenadas del ratón
•Los datos del teclado
•La tarjeta de audio
•La tarjeta gráfica
•…
LOS PUNTEROS
•UN PUNTERO ES ALGO… MUY SERIO.
void main(void)
{
int *p1;
for (int i=0; true ;i++)
{
*(p1+i)=0;
*(p1-i)=0;
}
}
Descargar

(p+1)=0