Hola y bienvenido de nuevo. Ahora que entendemos los punteros con un poco
más de detalle, quiero hablar sobre los punteros de
carácter, principalmente cómo se pueden usar los punteros de carácter para representar cadenas.
Las cadenas son matrices de caracteres, varios caracteres, palabras.
Así que ahora sabemos cómo se relacionan las matrices con los punteros en el concepto de aritmética de punteros.
Concepto muy, muy útil.
Estos conceptos pueden ser muy útiles cuando se aplican
a cadenas de matrices de caracteres porque ahora podemos atravesar fácilmente una cadena carácter por carácter.
Una de las aplicaciones más comunes de usar un puntero a una matriz es
como puntero a una cadena de caracteres.
Las razones son de conveniencia y eficiencia de notación.
Entonces, usar una variable de tipo puntero a char para hacer
referencia a una cadena le brinda mucha flexibilidad.
Por lo tanto, intentará usar
punteros de caracteres tanto como pueda sobre
matrices de caracteres, específicamente usando punteros de caracteres para pasar datos a una función.
Todo tipo de cosas bonitas como esa.
Entonces, veamos un ejemplo que usa una matriz para copiar una cadena.
En este ejemplo, nuestro parámetro de matriz será una matriz de caracteres.
Lo verá directamente en la declaración de la función.
Quiero comparar esto con una función que toma un puntero de
carácter y mostrarle cómo la función de puntero de carácter es mucho más eficiente.
Entonces, en este ejemplo, tenemos dos funciones, una
que toma una matriz y otra
que toma punteros.
En la primera cadena de copia de
función, podemos recorrer toda la matriz usando un bucle for I igual a cero desde sub
I y recorremos todo el camino hasta que vemos la cadena de caracteres nulos
y luego incrementamos nuestra variable de control de bucle.
Y luego todo lo que tienes que hacer es decir 2 sub I es igual a sub I. Estamos haciendo una asignación
directa allí.
Y luego, al final, después de haber recorrido todo el camino hasta que
vemos un carácter nulo, agregamos un carácter nulo al final de
nuestra matriz to, bastante básico. Ahora veamos cómo lo hacemos cuando usamos punteros.
Primero, declaramos a los punteros como la declaración de función en la cadena
de copia simplemente diciendo char star a char start from.
En nuestro bucle for, no tenemos que declarar ninguna
variable porque tenemos punteros y solo queremos
iterar hasta que el from llegue al terminador nulo.
Y luego podemos incrementar los punteros desde y hasta.
Porque aquí estamos haciendo aritmética de puntos.
Solo estamos agregando uno al puntero que aumenta su dirección en uno, lo que
obtiene el siguiente carácter.
Y en la siguiente línea de bucle for
simplemente eliminamos la referencia a y desde porque
queremos asignar el valor real al que apunta el puntero,
el carácter real al puntero a.
Y luego, al final, agregamos el carácter
nulo a donde esté apuntando el puntero to que estaría
al final de la última dirección de la cadena para from pero ahora
apuntando en la dirección to.
No se ve tan mal. Quiero decir que tienes un bucle for.
Básicamente tienes la misma cantidad de líneas de código.
Pero ves la diferencia en la sintaxis.
No usa subíndices y usa punteros, use el asterisco.
Una vez más, realmente se trata de una cuestión de conveniencia de notación.
No ve una gran ventaja aquí.
Pero en realidad puede optimizar esto más para reducir
incluso a menos código cuando usa los punteros.
Entonces, si tiene una matriz de
caracteres como puntero, si tiene una matriz de caracteres llamada texto, podría definir de
manera similar un puntero y usar los elementos en el texto.
Entonces, aquí podríamos decir puntero de texto de
estrella de caracteres, así es como se define un puntero de carácter.
Si el puntero de texto se establece apuntando al comienzo de la
matriz de caracteres llamada texto, entonces
puede incrementarlo en uno usando estos operadores de pre y post implementación y decrementación.
Así que esto de arriba, este puntero de texto más más va a establecer el puntero de
texto apuntando al siguiente carácter en el texto, que es el texto sub 1.
Entonces, si queremos mirar en el siguiente rayo como si fueran números
enteros, todo lo que tenemos que hacer es sumar 1 2 y podemos obtener el siguiente carácter.
Sin embargo, es mucho más útil en
matrices de caracteres porque puede manipular fácilmente los caracteres uno por uno.
Si hace un puntero de texto menos menos, que es el operador de disminución, eso
establecerá el puntero en el carácter anterior en el texto, asumiendo
que el puntero de texto no apuntaba al principio del texto.
Porque si lo fuera, tendrá estos errores por debajo de los límites.
Si estuviera haciendo un más más al final de la cadena, tendría un error de fuera de límites.
Siempre debe tener cuidado, al igual que una aritmética de enteros, para no sobrepasar los límites de una matriz.
Pero es muy simple, se relaciona muy de cerca con cuando haces aritmética
de punteros enteros.
La aritmética de puntero de caracteres es lo mismo.
Es incluso más útil porque ahora puedes ver caracteres individuales sin usar un subíndice.
Entonces, si miramos el ejemplo anterior,
podemos optimizarlo un poco más usando punteros para hacer aún
menos líneas de código.
Entonces, ahora en nuestra cadena de copia, hacemos que esta declaración de función sea la misma que antes,
creamos un par de punteros usando el asterisco.
Pero ya no usamos un bucle for porque no tenía sentido usar
un bucle for en el ejemplo anterior
porque en realidad no necesitábamos inicializar la variable de control del bucle.
Todo lo que teníamos que hacer era salir de
un bucle con una condición y luego en realidad estamos usando los operadores de incremento
y disminución en el bucle for, pero ni siquiera necesitamos hacer eso.
En realidad, se vuelve aún mucho más simple aquí porque si usamos un ciclo while,
todo lo que tenemos que hacer es mirar el ciclo while y
saltará si apunta a un carácter nulo porque el carácter nulo es en
realidad igual a cero.
Y el ciclo while recuerda que los booleanos
en c están representados por enteros, uno es verdadero y luego cero
es falso o realmente cero es falso y luego cualquier otra cosa es verdadera.
En este caso, el carácter nulo 0 que es falso, saltará.
Entonces, todo lo que tiene que hacer para la condición de salida en el ciclo while es poner un asterisco de.
¿Qué es esa acción que está desreferenciando para ver cuál es el valor de ese personaje?
Entonces, cuando llegamos al final de la cadena de la que queremos copiar, saltamos.
De lo contrario, simplemente colocamos nuestra modificación
de nuestros punteros allí, dos más más de más más.
Ahora bien, este es un operador de incremento posterior.
Entonces, lo que esto significa es que el más más está en el lado derecho de la variable.
Y cuando haces esto, significa que no le
agregas uno hasta después de que la declaración esté lista.
Entonces, lo que esto va a hacer, va a decir que la estrella 2 es igual a comenzar desde.
Y luego, después de que se haga esa declaración, se sumará a 2 1 y se agregará a partir de 1.
Si tuviera el más más antes del nombre de la
variable, se agregaría a esa variable antes de que ejecute esa declaración y eso
sería un problema porque perderíamos esencialmente el primer elemento que se copia
en la cadena.
Pero no necesitamos más líneas de código. Estamos haciendo una aritmética de puntero de
incremento real y una asignación en la misma declaración, por lo
que reducimos el código en uno.
Nuevamente, la notación es muy simple.
Estamos haciendo una asignación aritmética de números enteros con mucha facilidad.
Y luego, al final, después de que hayamos terminado, copiando
todas las cadenas, simplemente agregamos al
final el carácter nulo al puntero que desreferenciamos porque los dos son en realidad la
razón por la que pasa por el bucle, estará apuntando al último personaje.
Así que está un poco limpiado un poco aquí.
Le muestra el poder de los punteros
y cómo puede usar punteros y aritmética en las mismas líneas y
con estos operadores de incremento y decremento, estos más más y menos menos, lo
hace aún más rápido y fácil para que también sea más eficiente.
Si quisiéramos utilizar estas funciones de copia de cadena, podríamos crear dos matrices de caracteres.
Podemos pasar las matrices de caracteres directamente a la cadena de copia porque las matrices de
0 caracteres son punteros.
Son punteros, por lo que no tenemos que quitarles la
referencia ni agregar direcciones ni nada. Podríamos decir simplemente cadena2, cadena1.
Entonces, lo que va a hacer es copiar una
cadena para copiarla en la matriz de caracteres string2
y luego imprimirla usando printf.
Quería ver un ejemplo de cómo se pueden usar punteros de
caracteres en lugar de matrices de caracteres y por qué a veces se prefieren.
Mencionamos que a veces es la preferencia del programador donde si
ha programado en lenguajes anteriores como Fortran, es posible
que esté acostumbrado a subir. Pero si lo tiene,
verá los beneficios de usar punteros.
Espero que esto haya sido útil. Gracias.