Punteros C
Puntero C
En este tutorial, aprenderá acerca de los punteros; qué son los punteros, cómo los usa y los errores comunes que puede encontrar al trabajar con ellos con la ayuda de ejemplos.
Los punteros son características poderosas de la programación en C y C++. Antes de aprender punteros, aprendamos acerca de las direcciones en la programación C.
Dirección en C
Si tiene una variable var en su programa, &var
le dará su dirección en la memoria.
Hemos usado la dirección varias veces mientras usamos el scanf()
función.
scanf("%d", &var);
Aquí, el valor ingresado por el usuario se almacena en la dirección de var variable. Tomemos un ejemplo práctico.
#include <stdio.h>
int main()
{
int var = 5;
printf("var: %d\n", var);
// Notice the use of & before var
printf("address of var: %p", &var);
return 0;
}
Salida
var: 5 address of var: 2686778
Puntero C
Los punteros (variables de puntero) son variables especiales que se utilizan para almacenar direcciones en lugar de valores.
Sintaxis de puntero
Así es como podemos declarar punteros.
int* p;
Aquí, hemos declarado un puntero p de int
tipo.
También puede declarar punteros de estas formas.
int *p1;
int * p2;
Tomemos otro ejemplo de declaración de punteros.
int* p1, p2;
Aquí, hemos declarado un puntero p1 y una variable normal p2 .
Asignación de direcciones a punteros
Tomemos un ejemplo.
int* pc, c;
c = 5;
pc = &c;
Aquí, 5 se asigna a la c variable. Y, la dirección de c se asigna a la pc puntero.
Obtener el valor de la cosa señalada por punteros
Para obtener el valor de la cosa señalada por los punteros, usamos el *
operador. Por ejemplo:
int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc); // Output: 5
Aquí, la dirección de c
se asigna a la pc puntero. Para obtener el valor almacenado en esa dirección, usamos *pc .
*pc
. No puedes ni debes hacer algo como *pc = &c
;
Por cierto, *
se denomina operador de desreferencia (cuando se trabaja con punteros). Opera en un puntero y da el valor almacenado en ese puntero.
Cambiando valor apuntado por punteros
Tomemos un ejemplo.
int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c); // Output: 1
printf("%d", *pc); // Ouptut: 1
Hemos asignado la dirección de c al ordenador puntero.
Luego, cambiamos el valor de c a 1. Desde pc y la dirección de c es lo mismo, *pc
nos da 1.
Tomemos otro ejemplo.
int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc); // Ouptut: 1
printf("%d", c); // Output: 1
Hemos asignado la dirección de c al ordenador puntero.
Luego, cambiamos *pc
a 1 usando *pc = 1;
. Desde ordenador y la dirección de c es lo mismo, c será igual a 1.
Tomemos un ejemplo más.
int* pc, c, d;
c = 5;
d = -15;
pc = &c; printf("%d", *pc); // Output: 5
pc = &d; printf("%d", *pc); // Ouptut: -15
Inicialmente, la dirección de c se asigna a la pc puntero usando pc = &c;
. Desde c es 5, *pc
nos da 5.
Luego, la dirección de d se asigna a la pc puntero usando pc = &d;
. Desde d es -15, *pc
nos da -15.
Ejemplo:Funcionamiento de Punteros
Tomemos un ejemplo práctico.
#include <stdio.h>
int main()
{
int* pc, c;
c = 22;
printf("Address of c: %p\n", &c);
printf("Value of c: %d\n\n", c); // 22
pc = &c;
printf("Address of pointer pc: %p\n", pc);
printf("Content of pointer pc: %d\n\n", *pc); // 22
c = 11;
printf("Address of pointer pc: %p\n", pc);
printf("Content of pointer pc: %d\n\n", *pc); // 11
*pc = 2;
printf("Address of c: %p\n", &c);
printf("Value of c: %d\n\n", c); // 2
return 0;
}
Salida
Address of c: 2686784 Value of c: 22 Address of pointer pc: 2686784 Content of pointer pc: 22 Address of pointer pc: 2686784 Content of pointer pc: 11 Address of c: 2686784 Value of c: 2
Explicación del programa
int* pc, c;
Aquí, un puntero pc y una variable normal c , ambos de tipoint
, es creado.
Desde ordenador y c no se inicializan inicialmente, puntero pc apunta a ninguna dirección o a una dirección aleatoria. Y, variable c tiene una dirección pero contiene un valor de basura aleatorio.
c = 22;
Esto asigna 22 a la variable c . Es decir, 22 se almacena en la ubicación de memoria de la variable c .
pc = &c;
Esto asigna la dirección de la variable c al puntero pc .
c = 11;
Esto asigna 11 a la variable c .
*pc = 2;
Esto cambia el valor en la ubicación de memoria señalada por el puntero pc a 2.
Errores comunes al trabajar con punteros
Supongamos que desea el puntero pc para apuntar a la dirección de c . Entonces,
int c, *pc;
// pc is address but c is not
pc = c; // Error
// &c is address but *pc is not
*pc = &c; // Error
// both &c and pc are addresses
pc = &c; // Not an error
// both c and *pc values
*pc = c; // Not an error
Este es un ejemplo de sintaxis de punteros que los principiantes suelen encontrar confusos.
#include <stdio.h>
int main() {
int c = 5;
int *p = &c;
printf("%d", *p); // 5
return 0;
}
¿Por qué no recibimos un error al usar int *p = &c;
? ?
Es porque
int *p = &c;
es equivalente a
int *p:
p = &c;
En ambos casos, estamos creando un puntero p
(no *p
) y asignando &c
a ella.
Para evitar esta confusión, podemos usar la declaración como esta:
int* p = &c;
Ahora que sabe qué son los punteros, aprenderá cómo se relacionan los punteros con las matrices en el siguiente tutorial.
Lenguaje C
- C# Hello World:su primer programa en C#
- Identificadores y palabras clave de C#
- Variables de C# y tipos de datos (primitivos)
- Operadores de C#
- Operadores C# Bitwise y Bit Shift
- Entrada y salida básica de C#
- Expresiones, declaraciones y bloques de C# (con ejemplos)
- Comentarios de C#
- Punteros C
- Relación entre matrices y punteros
- Direcciones y punteros de C Pass