17:20
@Oscar Están pasando muchas cosas en esa simple línea. Vamos parte por parte.
Primero *src
accede a la dirección de memoria a la que apunta src
y obtiene de ahi un byte (un char). Eso es asignado a *dst
, es decir, a la dirección de memoria a la que apunta dst
. Por tanto se ha copiado un byte de una dirección de memoria a otra
Además, debido al ++
se han incrementado (después de ser usados) ambos punteros. Cada uno de ellos apunta ahora a la dirección de memoria siguiente a la que apuntaban previamente
Y además, el byte que ha sido copiado de una dirección a otra es el resultado de toda esa expresión entre paréntesis, que es el valor que usa while ()
para decidir si ejecutar esa expresión otra vez
si ese byte era distinto de cero, será para while
el equivalente a un True
, y repetirá el bucle. Si en cambio el byte copiado era cero, para while será False
y no se ejecutará más.
por tanto se están copiando bytes de una dirección a otra, y se incrementan las direcciones, hasta que el byte copiado sea cero
en definitiva ¡se está copiando una cadena completa de una dirección a otra, incluyendo el carácter nulo (byte 0) que marca el fin de la cadena!
Si la cadena original comenzaba en la dirección, digamos por ejemplo 0x1000 y ocupaba 4 letras más el terminador, src
comenzaría con ese valor 0x1000. Y digamos que dst
apuntaba a 0x2000. Entonces se irán copiando bytes desde 0x1000, 0x1001, 0x1002, ... hacia 0x2000, 0x2001, 0x2002, etc..
hasta encontrar el cero terminador, cosa que ocurrirá cuando se copie de 0x1005 hacia 0x2005 momento en que termina el bucle
observa que esta técnica, aunque simple y elegante, está modificando src
y dst
que al terminar no apuntarán ya a donde comenzaban las cadenas, sino a donde terminan.
es más común copiar cadenas usando strcpy(dst, src)
que hace en el fondo lo mismo, pero no perdemos los valores originales de los punteros