Saltar al contenido principal

02.03 - Punteros

Lenguajes Estructurados


¿Qué son los punteros?

  • Un puntero es una variable que almacena la dirección de memoria de otra variable.

  • Los punteros permiten acceder y manipular indirectamente el contenido de otras variables en la memoria.


¿Cómo se declaran los punteros?

Para declarar un puntero, utilizamos el operador * seguido del nombre de la variable.

int *p;

¿Cómo se inicializan los punteros?

Para inicializar un puntero, utilizamos el operador & seguido del nombre de la variable.


int x = 5;
int *p = &x; // p es un puntero que apunta a la dirección de memoria de x

¿Cómo se accede al valor de una variable a través de un puntero?

Para acceder al valor de una variable a través de un puntero, utilizamos el operador *.

int x = 5;
int *p = &x;
int y = *p;

¿Cómo se modifica el valor de una variable a través de un puntero?

Para modificar el valor de una variable a través de un puntero, utilizamos el operador *.

int x = 5;
int *p = &x;
*p = 10;

¿Cómo se pasan punteros a funciones?

Para pasar un puntero a una función, utilizamos el operador * en la declaración de la función.

void incrementar(int *p) {
*p = *p + 1;
}

Pasar argumentos por referencia con punteros

Los punteros se pueden utilizar para pasar argumentos a funciones "por referencia" en lugar de "por valor".

Al pasar un puntero a una función, la función puede modificar el valor de la variable original en lugar de trabajar con una copia local de la variable.

void incrementar(int *num) {
(*num)++;
}

int main() {
int x = 0;
incrementar(&x); // x ahora vale 1


¿Cómo se retorna un puntero de una función?

Para retornar un puntero de una función, utilizamos el operador * en la declaración de la función.

int *maximo(int *p1, int *p2) {
if (*p1 > *p2) {
return p1;
} else {
return p2;
}
}

¿Cómo se pasan arreglos a funciones?

Para pasar un arreglo a una función, no es necesario utilizar el operador *.

void imprimir_arreglo(int arreglo[], int tam) {
for (int i = 0; i < tam; i++) {
printf("%d ", arreglo[i]);
}
printf("\n");
}

¿Cómo se retorna un arreglo de una función?

Para retornar un arreglo de una función, no es necesario utilizar el operador *.


int *maximos(int arreglo[], int tam) {
int *maximos = malloc(tam * sizeof(int));
for (int i = 0; i < tam; i++) {
maximos[i] = arreglo[i] * 2;
}
return maximos;
}

Ejemplo 1

Supongamos que tenemos una variable "x" y queremos modificar su valor en una función. Para hacer esto, podemos utilizar un puntero que apunte a la dirección de memoria de la variable "x".

Primero, definimos la variable "x" y la inicializamos con un valor.

int x = 10;

Luego, definimos una función llamada "modificar_valor" que toma un puntero como argumento. Dentro de la función, podemos modificar el valor de la variable a la que apunta el puntero utilizando el operador de indirección "*".

void modificar_valor(int *p) {
*p = 20;
}

Para llamar a la función, podemos pasarle la dirección de memoria de la variable "x" utilizando el operador de dirección "&".

modificar_valor(&x);

Después de llamar a la función, el valor de la variable "x" habrá cambiado a 20.

printf("Valor de x: %d\n", x);

Podemos utilizar punteros en combinación con estructuras para acceder y modificar los campos de la estructura.

Por ejemplo, supongamos que tenemos una estructura "Persona" que contiene los campos "nombre", "edad" y "altura". Podemos crear una variable "persona1" de tipo "Persona" y utilizar un puntero para acceder y modificar los campos de la estructura.


struct Persona {
char nombre[50];
int edad;
float altura;
};
struct Persona persona1 = {"Juan", 30, 1.75};
struct Persona *p = &persona1;

(*p).edad = 35;
p->altura = 1.80;

En este ejemplo, creamos un puntero "p" que apunta a la dirección de memoria de la variable "persona1". Luego, utilizamos el operador de indirección "*" para acceder al contenido de la estructura y el operador de flecha "->" para acceder a los campos de la estructura.


Ejemplo 2

Invertir una cadena de caracteres utilizando punteros.

#include <stdio.h>
#include <string.h>

void swap(char *a, char *b) {
char temp = *a;
*a = *b;
*b = temp;
}

void invertirCadena(char *cadena) {
int n = strlen(cadena);
for (int i = 0; i < n / 2; ++i) {
swap(&cadena[i], &cadena[n - i - 1]);
}
}

int main() {
char cadena[] = "Ingeniería";
printf("Cadena original: %s\n", cadena);

invertirCadena(cadena);
printf("Cadena invertida: %s\n", cadena);

return 0;
}

  • Este ejemplo muestra cómo se pueden utilizar punteros para manipular y modificar una cadena de caracteres.

  • Se usan punteros para pasar caracteres individuales a la función swap, que intercambia dos caracteres.

  • La función invertirCadena utiliza punteros para acceder y modificar los caracteres en la cadena original.