Fundamentos de la programación
9A
Grado en Ingeniería Informática
Grado en Ingeniería del Software
Grado en Ingeniería de Computadores
Facultad de Informática
Luis Hernández Yáñez
Universidad Complutense
Aritmética de punteros
Recorrido de arrays con punteros
Referencias
Listas enlazadas
940
953
962
964
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 940
Operaciones aritméticas con punteros
int dias[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
typedef int* tIntPtr;
tIntPtr punt = dias;
La aritmética de punteros es una aritmética un tanto especial...
Trabaja tomando como unidad de cálculo el tamaño del tipo base
puntempieza apuntando al primer elemento del array:
punt++hace que puntpase a apuntar al siguiente elemento
A la dirección de memoria actual se le suman tantas unidades
como bytes (4) ocupe en memoria un dato de ese tipo (int)
cout << *punt << endl; // Muestra 31 (primer elemento)
punt++;
cout << *punt << endl; // Muestra 28 (segundo elemento)
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 941
int dias[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 };
typedef int* tIntPtr;
tIntPtr punt = dias;
dias[0]
dias[1]
dias[2]
dias
punt
...
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
0F03:1A40
0F03:1A41
0F03:1A42
0F03:1A43
...
0F07:0417
0F07:0418
0F07:0419
0F07:041A
0F07:041B
0F07:041C
0F07:041D
0F07:041E
...
3131
2828
3131
0F
03
1A
38
0F
03
1A
38
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 942
int dias[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 };
typedef int* tIntPtr;
tIntPtr punt = dias;
punt++;
dias[0]
dias[1]
dias[2]
punt‐‐hace que apunte al elemento anterior
dias
punt
...
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
0F03:1A40
0F03:1A41
0F03:1A42
0F03:1A43
...
0F07:0417
0F07:0418
0F07:0419
0F07:041A
0F07:041B
0F07:041C
0F07:041D
0F07:041E
...
3131
2828
3131
0F
03
1A
38
0F
03
1A
3C
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 943
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
int dias[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 };
typedef int* tIntPtr;
tIntPtr punt = dias;
punt = punt + 2;
Restando pasamos a elementos anteriores
dias[0]
dias[1]
dias[2]
dias
punt
...
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
0F03:1A40
0F03:1A41
0F03:1A42
0F03:1A43
...
0F07:0417
0F07:0418
0F07:0419
0F07:041A
0F07:041B
0F07:041C
0F07:041D
0F07:041E
...
3131
2828
3131
0F
03
1A
38
0F
03
1A
40
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 944
int dias[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 };
typedef int* tIntPtr;
tIntPtr punt = dias;
punt = punt + 2;
Nº de elementos entre los punteros
int num = punt ‐ dias;
dias[0]
dias[1]
dias[2]
dias
punt
...
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
0F03:1A40
0F03:1A41
0F03:1A42
0F03:1A43
...
0F07:0417
0F07:0418
0F07:0419
0F07:041A
0F07:041B
0F07:041C
0F07:041D
0F07:041E
...
3131
2828
3131
0F
03
1A
38
0F
03
1A
3C
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 945
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
short int(2 bytes)
Otro tipo base
short int dias[12] = {31, 28, 31, 30,
31, 30, 31, 31, 30, 31, 30, 31};
typedef short int* tSIPtr;
tSIPtr punt = dias;
dias[0]
dias[1]
dias[2]
dias[3]
dias[4]
dias
punt
...
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
0F03:1A40
0F03:1A41
...
0F07:0417
0F07:0418
0F07:0419
0F07:041A
0F07:041B
0F07:041C
0F07:041D
0F07:041E
...
3131
2828
3131
3030
3131
0F
03
1A
38
0F
03
1A
38
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 946
short int dias[12] = {31, 28, 31, 30,
31, 30, 31, 31, 30, 31, 30, 31};
typedef short int* tSIPtr;
tSIPtr punt = dias;
punt++;
dias[0]
dias[1]
dias[2]
dias[3]
dias[4]
dias
punt
...
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
0F03:1A40
0F03:1A41
...
0F07:0417
0F07:0418
0F07:0419
0F07:041A
0F07:041B
0F07:041C
0F07:041D
0F07:041E
...
3131
2828
3131
3030
3131
0F
03
1A
38
0F
03
1A
3A
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 947
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
short int dias[12] = {31, 28, 31, 30,
31, 30, 31, 31, 30, 31, 30, 31};
typedef short int* tSIPtr;
tSIPtr punt = dias;
punt++;
punt = punt + 3;
dias[0]
dias[1]
dias[2]
dias[3]
dias[4]
dias
punt
...
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
0F03:1A40
0F03:1A41
...
0F07:0417
0F07:0418
0F07:0419
0F07:041A
0F07:041B
0F07:041C
0F07:041D
0F07:041E
...
3131
2828
3131
3030
3131
0F
03
1A
38
0F
03
1A
40
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 948
short int dias[12] = {31, 28, 31, 30,
31, 30, 31, 31, 30, 31, 30, 31};
typedef short int* tSIPtr;
tSIPtr punt = dias;
punt++;
punt = punt + 3;
punt‐‐;
dias[0]
dias[1]
dias[2]
dias[3]
dias[4]
dias
punt
...
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
0F03:1A40
0F03:1A41
...
0F07:0417
0F07:0418
0F07:0419
0F07:041A
0F07:041B
0F07:041C
0F07:041D
0F07:041E
...
3131
2828
3131
3030
3131
0F
03
1A
38
0F
03
1A
3E
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 949
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
short int dias[12] = {31, 28, 31, 30,
31, 30, 31, 31, 30, 31, 30, 31};
typedef short int* tSIPtr;
tSIPtr punt = dias;
punt++;
punt = punt + 3;
punt‐‐;
tSIPtr punt2;
dias[0]
dias[1]
dias[2]
dias[3]
dias[4]
dias
punt
punt2
...
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
0F03:1A40
0F03:1A41
...
0F07:0417
0F07:0418
0F07:0419
0F07:041A
0F07:041B
0F07:041C
0F07:041D
0F07:041E
0F07:041F
3131
2828
3131
3030
3131
0F
03
1A
38
0F
03
1A
3E
?
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 950
short int dias[12] = {31, 28, 31, 30,
31, 30, 31, 31, 30, 31, 30, 31};
typedef short int* tSIPtr;
siPtr punt = dias;
punt++;
punt = punt + 3;
punt‐‐;
tSIPtr punt2;
punt2 = dias;
dias[0]
dias[1]
dias[2]
dias[3]
dias[4]
dias
punt
punt2
...
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
0F03:1A40
0F03:1A41
...
0F07:0417
0F07:0418
0F07:0419
0F07:041A
0F07:041B
0F07:041C
0F07:041D
0F07:041E
0F07:041F
3131
2828
3131
3030
3131
0F
03
1A
38
0F
03
1A
3E
0F
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 951
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
short int dias[12] = {31, 28, 31, 30,
31, 30, 31, 31, 30, 31, 30, 31};
typedef short int* tSIPtr;
siPtr punt = dias;
punt++;
punt = punt + 3;
punt‐‐;
tSIPtr punt2;
punt2 = dias;
cout << punt – punt2; // 3
33
dias[0]
dias[1]
dias[2]
dias[3]
dias[4]
dias
punt
punt2
...
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
0F03:1A40
0F03:1A41
...
0F07:0417
0F07:0418
0F07:0419
0F07:041A
0F07:041B
0F07:041C
0F07:041D
0F07:041E
0F07:041F
3131
2828
3131
3030
3131
0F
03
1A
38
0F
03
1A
3E
0F
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 952
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 953
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Punteros como iteradores para arrays
arraypunt.cpp
arraypunt.cpp
const int MAX = 100;
typedef int tArray[MAX];
typedef struct {
tArray elementos;
int cont;
} tLista;
typedef int* tIntPtr;
tLista lista;
Usamos un puntero como iteradorpara recorrer el array:
tIntPtr punt = lista.elementos;
for (int i = 0; i < lista.cont; i++) {
cout << *punt << endl;
punt++;
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
}
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 954
...
intPtr punt = lista.elementos;
puntpunt
lista.elementos
lista.elementos
0
4
1
13
2
3
4
3
5
47 53 19
6
7
7
48
8
...
98
99
lista.cont
lista.cont
8
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 955
...
for (int i = 0; i < lista.cont; i++) {
cout << *punt << endl;
punt++;
ii
0
puntpunt
lista.elementos
lista.elementos
0
4
1
13
2
3
4
3
5
47 53 19
6
7
7
48
8
...
98
99
lista.cont
lista.cont
8
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 956
...
for (int i = 0; i < lista.cont; i++) {
44
cout << *punt << endl;
punt++;
ii
1
puntpunt
lista.elementos
lista.elementos
0
4
1
13
2
3
4
3
5
47 53 19
6
7
7
48
8
...
98
99
lista.cont
lista.cont
8
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 957
}
}
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
...
for (int i = 0; i < lista.cont; i++) {
cout << *punt << endl;
punt++;
4
4
13
13
ii
2
puntpunt
lista.elementos
lista.elementos
0
4
1
13
2
3
4
3
5
47 53 19
6
7
7
48
8
...
98
99
lista.cont
lista.cont
8
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 958
...
for (int i = 0; i < lista.cont; i++) {
cout << *punt << endl;
punt++;
4
4
13
13
3
3
ii
3
puntpunt
lista.elementos
lista.elementos
0
4
1
13
2
3
lista.cont
lista.cont
8
8
...
98
99
6
7
7
48
4
3
5
47 53 19
. . .
. . .
Fundamentos de la programación: Punteros y memoria dinámica (Anexo)
Página 959
}
}
z
e
ñ
á
Y
z
e
d
n
á
n
Comentarios de: 9A Punteros y memoria dinámica - Fundamentos de la programación (0)
No hay comentarios