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