20241029 Copiar array - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Voy a grabar esta clase, por lo tanto, si habláis, me dais vuestro consentimiento a hablar, a grabar.
00:00:00
Vale, entonces, ahora lo que vamos a ver es el concepto de copiar un array, ¿vale?
00:00:07
Imaginámonos que yo tenga este array, string, corchetes x, es igual a un array, ¿vale?
00:00:12
Y que ahora cree un nuevo array, string, corchetes y, es igual a x, ¿sí?
00:00:19
Y ahora me voy a X en posición 3, 0, 1, 2, 3, y cambio este señor con 7.
00:00:27
¿Qué pasa si ahora miro Y de 3?
00:00:38
Pues lo que pasa es que también Y de 3 ha cambiado a 7.
00:00:44
¿Por qué?
00:00:50
Porque cuando yo creo un array, la X es como con los strings más o menos, no es un tipo primitivo, es un objeto, entonces aquí dentro no hay el valor directamente,
00:00:51
Pero hay un puntero, el famoso que luego hace null pointer exception, un puntero, una zona de memoria en el que está este array.
00:01:08
Aquí lo tenemos. Este x no es el array, es una flecha hacia una zona de memoria en la que está el array.
00:01:20
¿Sí? Ahora, cuando hago esta operación de aquí, string y es igual a x, no estoy copiando la memoria
00:01:30
No estoy copiando el array, pero estoy creando un nuevo y que apunta a la misma zona de memoria
00:01:39
Entonces, estos no son dos arrays distintos, pero son el mismo array referenciado por dos variables distintas
00:01:46
Tengo dos variables que apuntan al mismo objeto
00:01:58
Es lo que estamos viendo
00:02:03
Entonces, si ahora el puntero X en posición 3
00:02:09
Cambia el interno a 7
00:02:13
O sea, el puntero X llega a esto
00:02:17
Vas a la zona 3 y modifica este 4
00:02:19
Y escribe 7
00:02:22
Lo está modificando en el array
00:02:23
Lo que quiere decir que Y de 3
00:02:26
También contendrá 7
00:02:29
O sea que los arrays no se copian así, un int se copia así, int x es igual a 3, int y es igual a x, he creado dos zonas de memoria separadas, los tres valen 3, si cambio x, no cambio y.
00:02:32
Ahora voy, ¿eh? Con enteros. Si yo hago int x es igual a 3, creo una zona de memoria que tiene solo int, que se llama x y que tiene dentro 3.
00:02:52
ahora hago int, y es igual a x
00:03:17
lo que estoy haciendo es crearme otra zona de memoria
00:03:22
que se llama y, que contiene int
00:03:26
y que tendrá aquí dentro el valor actual de x, o sea 3
00:03:29
si ahora hago x es igual a 7
00:03:33
esto se machaca y se pone un 7
00:03:37
y si ahora digo imprime y
00:03:42
me imprimirá 3
00:03:47
porque son dos trozos
00:03:50
de memorias distintos
00:03:55
¿se entiende esto?
00:03:56
todos los tipos primitivos
00:03:59
funcionan así
00:04:01
int, float
00:04:02
float, double
00:04:05
char
00:04:07
boolean
00:04:09
así
00:04:10
ahora, con los arrays
00:04:11
es distinto
00:04:16
cuando yo hago
00:04:17
int
00:04:20
array
00:04:22
x
00:04:24
es igual a algo
00:04:26
lo que estoy haciendo es crearme
00:04:28
una variable que se llama x
00:04:31
de tipo
00:04:33
no lo sé, de tipo puntero
00:04:34
¿vale? que en realidad
00:04:37
lo que tiene es un puntero
00:04:39
a una zona de memoria
00:04:41
y en esta zona de memoria
00:04:42
está mi array
00:04:44
con sus posiciones
00:04:45
0, 1, 2 y 3
00:04:49
cuando hago int
00:04:51
esta cosa aquí
00:04:55
y es igual a x
00:04:58
me creo también otro trozo de memoria
00:05:00
de tipo que se yo
00:05:03
que se llama y
00:05:05
y lo que tiene es el mismo valor que esto
00:05:07
y el mismo valor de esto es el mismo puntero
00:05:11
de la misma zona de memoria
00:05:13
¿se entiende?
00:05:14
entonces cuando ahora hago x
00:05:18
de 1 es igual a 9
00:05:20
quiere decir que pongo 9 aquí dentro
00:05:24
y cuando ahora hago siso
00:05:28
de y de 1
00:05:32
y apunta esta cosa aquí, voy a la 1
00:05:36
y escribo 9, ¿se entiende?
00:05:43
o sea que, repito
00:05:48
los arrays no se copian así
00:05:52
Esto no copia array
00:05:56
Esto hace dos referencias al mismo array
00:05:58
Por ejemplo, me puede servir para recorrer el array de dos formas distintas
00:06:01
No lo sé
00:06:08
Estoy dando dos nombres al mismo objeto
00:06:08
Todos los objetos funcionan así
00:06:12
Los objetos funcionan por referencia
00:06:15
Los tipos primitivos funcionan por valor
00:06:17
Por copia de valor
00:06:20
¿Cómo duplicas un objeto?
00:06:21
No tengo ni idea porque no sé qué es un objeto
00:06:25
¿Qué es un objeto? Ni idea
00:06:27
Pero sí que sé que existen los arrays. Entonces, ¿cómo copio un array? Fíjate tú. Es lo que estamos viendo. Copia de un array. Lo que no se hace es copiarlo así. Esto no copia el array.
00:06:29
¿Queda claro a todos que esto no es una copia del array? ¿Que estas dos cosas se quedan vinculadas entre ellas y si modifico uno estoy modificando también la otra?
00:06:44
¿Porque las dos cosas no son separadas, son el mismo objeto referenciado por dos variables distintas?
00:06:53
Esto será particularmente útil cuando en un futuro veremos lo que se llama el paso por referencia.
00:07:04
Paso un parámetro a un método
00:07:09
Y lo que hace el método sobre este objeto que le he pasado
00:07:12
Se verá también en el método que lo llama
00:07:16
Entonces, ¿cómo se hace?
00:07:18
Pues lo que se hace es lo siguiente
00:07:23
Para copiar un array
00:07:25
Lo que tengo que hacer es crearme otro array del mismo tamaño
00:07:30
Tengo mi array, creo otro array vacío del mismo tamaño
00:07:35
Y a este punto, celda por celda, voy a copiar lo que estaba en el viejo array en el nuevo
00:07:40
¿Cómo se hace?
00:07:49
Tengo mi array
00:07:52
Se ve algo
00:07:53
Tengo mi array
00:07:55
He perdido mi array
00:07:59
Lo tenía
00:08:05
Tengo mi array otra vez, tercera vez
00:08:06
La tercera vez la vencía
00:08:08
Creo un nuevo array
00:08:09
Nuevo
00:08:11
Este es un objeto distinto
00:08:12
no son el mismo, de hecho esto tiene 1, 2, 3, 4, 5
00:08:14
y este no tiene nada
00:08:18
tendrá todo null dentro
00:08:19
y ahora con un for
00:08:21
voy a mirar
00:08:24
todas las posiciones de este de aquí
00:08:25
y lo que voy a hacer
00:08:28
es copiármelo
00:08:29
de hecho
00:08:30
este de aquí no debería ser 5
00:08:36
debería ser x.length
00:08:38
me hago un array con los mismos números
00:08:41
posiciones de este de aquí
00:08:45
Luego recorro este array de aquí y cada uno de los elementos los copio en este nuevo elemento
00:08:46
Gráficamente, me creo un array con varias cosas
00:08:52
Vale, fenomenal
00:08:57
Me creo un nuevo array Y de 5 posiciones
00:08:58
Es este de aquí, veis que está vacío
00:09:02
Y ahora empiezo desde Y0 hasta YX.length
00:09:04
Y pillo 1 y lo copio aquí
00:09:10
Pillo 2 y lo copio aquí
00:09:12
Pillo 3 y lo copio aquí
00:09:14
pillo 4, lo copio aquí, pillo 5, lo copio aquí
00:09:16
y ahora tengo dos arrays que son
00:09:19
dos posiciones de memoria completamente separadas
00:09:22
que si modifico uno
00:09:25
este de aquí, no se está modificando
00:09:27
el otro, porque son completamente separados
00:09:31
se ve
00:09:34
si modifico uno, el otro se queda igual
00:09:41
porque ahora los dos punteros no apuntan
00:09:46
a la misma zona de memoria, entonces los cambios de uno se ven en el otro,
00:09:50
sino a zonas de memoria distintas, entonces los cambios que hago aquí
00:09:54
no se reflejarán aquí. A menos que no lo haga yo
00:09:57
explícitamente. Si ahora yo hago un i de 3 igual a 7,
00:10:02
pues modificará el otro. ¿Dudas?
00:10:06
¿A raíz multidimensionales os interesan? ¿For? ¿Por qué?
00:10:12
¿Por qué estáis aprendiendo los for? Hacedlo vosotros.
00:10:27
¿Hay algunos métodos perdidos en el multiverso que me permiten copiar un array?
00:10:32
Probablemente.
00:10:38
Probablemente, porque no es una cosa que hemos inventado hoy en clase, sino que es una cosa que se usa bastante comúnmente.
00:10:39
Por lo tanto, sí.
00:10:45
¿Y cuándo lo usaréis vosotros?
00:10:47
Pues esto vosotros lo usaréis cuando tendréis un array de cinco posiciones y el usuario os pone seis palabras.
00:10:49
Pero no quiero hacer spoiler con lo divertido que es eso cuando lo encontrare
00:11:00
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 17
- Fecha:
- 29 de octubre de 2024 - 11:08
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 11′ 08″
- Relación de aspecto:
- 16:10 El estándar usado por los portátiles de 15,4" y algunos otros, es ancho como el 16:9.
- Resolución:
- 1152x720 píxeles
- Tamaño:
- 27.20 MBytes