Apuntadores y cadenas

Lenguaje C

En C, un apuntador es una variable que almacena la dirección de memoria de otra variable. En lugar de almacenar el valor de una variable directamente, los apuntadores almacenan la dirección de memoria donde se encuentra el valor de la variable.

La ventaja de los apuntadores es que permiten a los programas manipular y acceder a la memoria de manera eficiente. Por ejemplo, si un programa necesita trabajar con una gran cantidad de datos, puede utilizar apuntadores para acceder a los datos de forma directa en la memoria, lo que puede mejorar el rendimiento del programa.

Además, los apuntadores también permiten la manipulación de estructuras de datos complejas, como listas enlazadas, árboles y grafos. Con los apuntadores, se pueden construir estructuras de datos dinámicas que se adaptan a la cantidad de datos que se están utilizando.

En resumen, los apuntadores son una herramienta poderosa en C que permiten a los programadores manipular la memoria y construir estructuras de datos dinámicas. Sin embargo, también pueden ser una fuente de errores y problemas si se utilizan incorrectamente, por lo que es importante entender bien su funcionamiento y utilizarlos con precaución.

1. Intercambio de valores

Este programa utiliza apuntadores para intercambiar los valores de dos variables:

#include <stdio.h>

void intercambiar(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    printf("Antes del intercambio: x = %d, y = %d\n", x, y);
    intercambiar(&x, &y);
    printf("Después del intercambio: x = %d, y = %d\n", x, y);
    return 0;
}

Este programa define una función intercambiar que toma dos apuntadores a enteros (int *a y int *b) como argumentos y utiliza los apuntadores para intercambiar los valores de las variables a las que apuntan.

En la función main, se define dos variables x e y, se imprimen sus valores antes del intercambio, se llama a la función intercambiar con los apuntadores correspondientes y luego se imprimen los valores después del intercambio.

2. Suma de enteros

Este programa utiliza apuntadores para sumar un conjunto de enteros:

#include <stdio.h>

int suma(int *arr, int n) {
    int total = 0;
    for (int i = 0; i < n; i++) {
        total += *arr;
        arr++;
    }
    return total;
}

int main() {
    int nums[] = {1, 2, 3, 4, 5};
    int n = sizeof(nums) / sizeof(int);
    int resultado = suma(nums, n);
    printf("La suma es: %d\n", resultado);
    return 0;
}

Este programa define una función suma que toma un apuntador a un array de enteros (int *arr) y la longitud del array (int n) como argumentos, y utiliza los apuntadores para sumar los enteros en el array.

En la función suma, se define una variable total que se utiliza para almacenar la suma total. Se utiliza un bucle for para iterar a través del array, sumando cada elemento al total y avanzando el apuntador arr a la siguiente posición en el array.

En la función main, se define un array de enteros nums y se llama a la función suma con el apuntador correspondiente y la longitud del array. El resultado se almacena en una variable resultado y se imprime en la pantalla.

3. Reserva de memoria dinámica

Este programa utiliza apuntadores para reservar memoria dinámica para un array de enteros:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 5;
    int *arr = (int*)malloc(n * sizeof(int));
    if (arr == NULL) {
        printf("Error: no se pudo asignar memoria\n");
        return 1;
    }
    for (int i = 0; i < n; i++) {
        arr[i] = i * 2;
        printf("%d ", arr[i]);
    }
    free(arr);
    return 0

Cadenas de caracteres

1. Imprimir una cadena de caracteres

Este programa utiliza un apuntador a una cadena de caracteres para imprimir la cadena en la pantalla:

#include <stdio.h>

void imprimir_cadena(char *cadena) {
    for (int i = 0; cadena[i] != '\0'; i++) {
        printf("%c", cadena[i]);
    }
    printf("\n");
}

int main() {
    char *cadena = "Hola, mundo!";
    imprimir_cadena(cadena);
    return 0;
}

En este programa, se define una función imprimir_cadena que toma un apuntador a una cadena de caracteres como argumento (char *cadena) y utiliza un ciclo for para recorrer la cadena de caracteres e imprimir cada caracter en la pantalla. La función también imprime un salto de línea al final.

En la función main, se define un apuntador a una cadena de caracteres (char *cadena) y se inicializa con la cadena «Hola, mundo!». Luego, se llama a la función imprimir_cadena con el apuntador cadena, lo que imprimirá la cadena en la pantalla utilizando la función printf dentro de la función imprimir_cadena.

Es importante destacar que la función imprimir_cadena y el ciclo for que utiliza son una forma equivalente a la utilización de la función printf con el formato %s para imprimir la cadena de caracteres.

2. Copiar una cadena de caracteres

Este programa utiliza apuntadores para copiar una cadena de caracteres a otra:

#include <stdio.h>

void copiar_cadena(char *destino, char *origen) {
    while (*origen != '\0') {
        *destino = *origen;
        origen++;
        destino++;
    }
    *destino = '\0';
}

int main() {
    char origen[] = "Hola, mundo!";
    char destino[20];
    copiar_cadena(destino, origen);
    printf("La cadena copiada es: %s\n", destino);
    return 0;
}

Este programa define una función copiar_cadena que toma dos apuntadores a cadenas de caracteres (char *destino y char *origen) como argumentos y utiliza los apuntadores para copiar la cadena de caracteres de origen a destino.

En la función copiar_cadena, se utiliza un bucle while para copiar cada caracter de origen a destino, avanzando los apuntadores origen y destino en cada iteración. La cadena copiada se finaliza con un caracter nulo (\0).

En la función main, se define una cadena de caracteres origen y un array destino para almacenar la cadena copiada. Se llama a la función copiar_cadena con los apuntadores correspondientes y se imprime la cadena copiada en la pantalla.

3. Concatenar dos cadenas de caracteres

Este programa utiliza apuntadores para concatenar dos cadenas de caracteres:


#include <stdio.h>

void copiar_cadena(char *destino, char *origen) {
    int i = 0;
    while (origen[i] != '\0') {
        destino[i] = origen[i];
        i++;
    }
    destino[i] = '\0';
}

void concatenar_cadena(char *destino, char *fuente) {
    int i = 0, j = 0;
    while (destino[i] != '\0') {
        i++;
    }
    while (fuente[j] != '\0') {
        destino[i] = fuente[j];
        i++;
        j++;
    }
    destino[i] = '\0';
}

int main() {
    char cadena1[20] = "Hola, ";
    char cadena2[] = "mundo!";
    char resultado[30];

    copiar_cadena(resultado, cadena1);
    concatenar_cadena(resultado, cadena2);

    printf("Cadena resultante: %s\n", resultado);
    return 0;
}

En este programa, se definen dos funciones: copiar_cadena y concatenar_cadena. La primera toma dos argumentos, un apuntador al arreglo de caracteres destino y un apuntador al arreglo de caracteres origen, y copia la cadena de caracteres del origen al destino. La segunda función también toma dos argumentos, un apuntador al arreglo de caracteres destino y un apuntador al arreglo de caracteres fuente, y concatena la cadena de caracteres fuente al final de la cadena de caracteres destino.

En la función main, se declaran tres arreglos de caracteres: cadena1, cadena2 y resultado. cadena1 se inicializa con la cadena «Hola, » y cadena2 se inicializa con la cadena «mundo!». resultado es un arreglo de caracteres lo suficientemente grande como para contener la concatenación de cadena1 y cadena2.

Luego, se llama a la función copiar_cadena con los argumentos resultado y cadena1, lo que copiará la cadena de caracteres de cadena1 al arreglo resultado. Luego, se llama a la función concatenar_cadena con los argumentos resultado y cadena2, lo que concatenará la cadena de caracteres de cadena2 al final del arreglo resultado.

Finalmente, se imprime la cadena resultante utilizando la función printf.

Puede que también te guste...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *