Hola y bienvenidos.
Vamos a comentar algunos temas más del manejo de cadenas y también cuando trabajamos con funciones en
el lenguaje C.
Bien.
Un primer detalle que quiero comentarles antes de cerrar con este tema es que el manejo de cadenas también
lo podemos definir de otras formas, precisamente aprovechando la sintaxis de apuntadores que ya hemos
comentado anteriormente, en lugar de definir nuestra cadena de esta forma, tal como lo vimos en la
definición de la función, también podríamos utilizar la sintaxis de apuntadores.
Así que en este caso voy a poner esta definición entre comentarios y ahora vamos a utilizar la sintaxis
como si trabajáramos con apuntadores.
Así que voy a poner un apuntador de tipo char y se va a llamar cadena y posteriormente le puedo asignar
una cadena.
En este caso, por ejemplo, el valor de la cadena de Hola.
En este caso no le estoy pidiendo al usuario que proporcione esta información, simplemente estoy poniendo
una cadena en código duro.
Sin embargo, si inicializamos nuestra cadena de esta forma, entonces ya no la podemos modificar dinámicamente.
De momento, voy a quitar este código.
Voy a dejar solamente la definición de la cadena en código duro.
Ahora, si ejecutamos, podemos observar que se imprime mensaje.
Hola.
Esto quiere decir que se está creando correctamente en nuestra cadena y posteriormente se pasa la referencia
a nuestra función.
A su vez, esta variable apunta exactamente al mismo arreglo de caracteres y finalmente se imprime la
cadena de hola y en memoria lo que sucede es lo siguiente Se crea en primer lugar nuestra cadena de
hola.
Sin embargo, al utilizar la sintaxis de apuntadores, podemos saber que se declara nuestra variable
de cadena, que es un apuntador a un tipo carácter.
Entonces, cuando definimos nuestra cadena de esta forma podemos observar que nuestro arreglo se crea
en una zona de memoria diferente.
Precisamente al utilizar esta sintaxis.
Entonces esta cadena se crea en una zona de memoria que se conoce como de solo lectura.
Por ello es que tenemos el mensaje que esta memoria es de solo lectura.
Por lo tanto ya no podemos hacer modificaciones, como en el caso del ejemplo que vimos cuando trabajamos
con valores de tipo entero y el manejo de arreglos.
En este caso ya no podemos modificar estos caracteres ya que estamos en una zona de solo lectura y por
ello, si por alguna razón dentro de nuestra función queremos hacer algún cambio, por ejemplo, si
después de mandar a imprimir el mensaje quisiéramos utilizar la sintaxis de arreglos y cambiar, por
ejemplo el índice cero en lugar de una hache mayúscula, ahora con una hache minúscula, podemos observar
que aunque el mensaje se imprime correctamente, nuestro programa no termina con el código cero.
Así que nuestro programa termina de manera errónea y nos manda este código con el que terminó nuestro
programa.
Pero es un código erróneo debido a que no podemos realizar cambios si es que inicializamos nuestra cadena
de esta forma con la sintaxis de apuntadores.
Así que podemos utilizar esta sintaxis para trabajar con cadenas, pero debemos de saber que en memoria
ya no podríamos realizar cambios directamente sobre esta cadena.
Ahora voy a poner entre comentarios la línea siete de nuestra función.
Y qué pasa si en la variable de mensaje ahora le asigno una nueva cadena de audios?
Vamos a ver qué es lo que sucede en memoria.
Así que si volvemos a ejecutar, entonces se define nuestra cadena de Hola.
La variable que es un apuntador a la cadena de hola.
Así que en memoria se crea esta cadena.
Pero recordemos que este arreglo se encuentra en una zona donde no podemos realizar cambios a ninguno
de estos caracteres.
Es una zona de sólo lectura.
Bien.
Posteriormente se mandan llamar nuestro método imprimir mensaje.
Así que se manda a llamar nuestra función.
Se define nuestra variable apuntador de mensaje que apunta a un carácter y el carácter que apunta es
el inicio cero de nuestra cadena.
La cadena de Hola.
Pero de igual manera está apuntando a una zona de sólo lectura.
Podemos observar que es exactamente la misma dirección de memoria.
Posteriormente se manda a imprimir el mensaje de hola a la consola y entonces hasta el momento está
funcionando correctamente en nuestro código.
Pero aquí viene lo interesante en la línea ocho.
Si queremos volver a asignar una cadena, entonces, debido a que esta variable es un apuntador, entonces
se vuelve a crear una nueva cadena en memoria.
Así que podemos observar que la cadena en memoria de hola, que está siendo apuntada por la variable
de cadena, todavía sigue disponible en memoria, pero debido a que tenemos la sintaxis de apuntador,
entonces ahora esta variable que es un apuntador, apunta a una nueva cadena que se está creando en
memoria, y recordemos que esta cadena también se almacena en una zona de sólo lectura.
Por lo tanto, es una nueva cadena y es una nueva referencia de memoria.
Así que en este caso, esta variable apunta a un arreglo y en este caso esta variable apunta a otro
arreglo.
Lo que sucede es que la variable de cadena va a seguir apuntando a la cadena de hola y la variable de
mensaje va a seguir apuntando a la cadena de Dios.
Pero recordemos que al terminar ejecutarse nuestra función se elimina de memoria de la función también
la variable de apuntador de mensaje y por lo tanto también perdemos la referencia de memoria de la cadena
de adiós.
Ya no es posible recuperar esta referencia, ya que ya no lo estamos regresando de ninguna manera.
Y entonces el apuntador de cadena se queda apuntando a la cadena de Hola.
Por lo tanto, cuando termina de ejecutarse nuestra función, regresamos al método principal, y si
desde el método principal imprimimos la variable de cadena, vamos a comprobar que se vuelve a imprimir
la cadena de Hola.
Vamos a hacerlo simplemente para comprobarlo.
Cadena original.
Vamos a ver que es la cadena original.
Es una cadena e imprimimos la variable de cadena.
Vamos a agregar un salto de línea al inicio para que no se junte, se imprima en una nueva línea.
Sin embargo, aquí, antes de ejecutar, voy a poner en primer lugar la modificación de la variable
de mensaje.
Así que dentro de la función vamos a mandar a imprimir el mensaje.
Pero ahora se va a imprimir la cadena de audios y fuera de nuestro método principal, la cadena original
tendría que mandar a imprimir la cadena de Hola.
Tal como lo estamos comprobando también en nuestra animación.
Bien, vamos a comprobar, vamos a ejecutar.
Y entonces podemos observar que la primera impresión se está imprimiendo la variable de mensaje.
Así que por ello la variable de mensaje imprime la cadena de audios.
Esta variable de mensaje ahora está apuntando a una nueva cadena, pero también que no se puede modificar.
Está en una zona de sólo lectura.
Así que la variable de mensaje originalmente estaba apuntando a esta dirección de memoria.
No puede modificar estos caracteres, pero eso no quiere decir que no pueda apuntar a una nueva cadena.
Así que por ello, con esta sintaxis, lo que estamos haciendo es que apunta a una nueva cadena que
se está creando en una zona de sólo lectura.
Se manda a imprimir esta variable de mensaje y entonces obtenemos mensaje.
Adiós.
Esto es lo que se imprime en consola.
Ya posteriormente no podríamos hacer ninguna modificación, ya que estas cadenas se encuentran en una
zona de solo lectura y posteriormente, una vez que termina de llamarse nuestra función, se manda a
imprimir la cadena original.
Y podemos observar entonces que la cadena original sigue apuntando a nuestra cadena de Hola.
Así que al terminar de ejecutarse nuestra función, se quita de memoria la función.
También la variable apuntador de mensaje y también la cadena de audios.
Solamente queda ya disponible la cadena de Hola.
Y en este caso la cadena de hola nunca ha cambiado.
Su referencia sigue apuntando exactamente a la misma referencia a la cadena de Hola.
De igual manera, en una zona de sólo lectura.
Así que ya no se pueden modificar estos caracteres de esta cadena.
Bien, básicamente con esto ya tenemos muchos más elementos para entender el uso de cadenas apuntadores
y también combinándolo con funciones.
Bien, recuerden que también pueden ejecutar paso a paso todo este ejercicio si todavía tuvieran alguna
duda.
Eso es todo por esta lección y nos vemos en el siguiente vídeo.
Saludos.