English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderá sobre punteros. ¿Qué es un puntero, cómo usarlo y los errores comunes que pueden encontrarse al usarlo en ejemplos.
Puntero es C y C ++ Una poderosa función de programación. Antes de aprender sobre punteros, aprendamos sobre la dirección en la programación de C.
Si hay una variable var en el programa, &var proporcionará su dirección en la memoria.
Al usar la función scanf(), ya hemos utilizado múltiples direcciones.
scanf("%d", &var);
Aquí, el valor ingresado por el usuario se almacena en la dirección de la variable var. Vamos a dar un ejemplo práctico.
#include <stdio.h> int main() { int var = 5; printf("var: %d\n", var); // Atención: use & antes de var printf("dirección de var: %p", &var); return 0; }
Resultado de la salida
var: 5 var dirección: 2686778
Atención:Al ejecutar el código anterior, es posible que obtenga otras direcciones.
Los punteros (variables de puntero) son variables especiales utilizadas para almacenar direcciones en lugar de valores.
Esta es la manera en que declaramos punteros.
int* p;
Aquí, ya hemos declarado un puntero de tipo int p。
También puede declarar punteros de la siguiente manera.
int *p1; int * p2;
Vamos a dar otro ejemplo de declaración de punteros.
int* p1, p2;
Aquí, declaramos un puntero p1Y una variable común p2.
Vamos a dar un ejemplo.
int* pc, c; c = 5; pc = &c;
Aquí, asignamos5Asignar a la variable c. Y asignar la dirección de c a la variable de puntero pc.
Para obtener el valor del contenido apuntado por el puntero, utilizamos el operador de desreferencia (*)。例如:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Salida: 5
Aquí, la dirección de c se ha asignado al puntero pc. Para obtener el valor almacenado en esa dirección, hemos utilizado*pc.
Vamos a dar un ejemplo.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Salida: 1 printf("%d", *pc); // Salida: 1
Ya hemos asignado la dirección de c al puntero pc.
Luego, cambiamos el valor de1. Dado que la dirección de pc y c son las mismas, por lo que*pc recibe1.
Vamos a dar otro ejemplo.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Salida: 1 printf("%d", c); // Salida: 1
Ya hemos asignado la dirección de c al puntero pc.
Luego, usamos* pc = 1; Asignamos* pc se cambia a1. Dado que la dirección de pc y c son las mismas, por lo que c es igual a1.
Vamos a dar otro ejemplo.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Salida: 5 pc = &d; printf("%d", *pc); // Salida: -15
Inicialmente, la dirección de c se asigna a la dirección del puntero pc: pc = &c;. Porque c es5por lo que*pc nos da5.
Luego, asignamos la dirección de d a la dirección del puntero pc: pc = &d;. Dado que d es-15por lo que*pc nos da-15.
Vamos a dar un ejemplo práctico.
#include <stdio.h> int main() { int* pc, c; c = 22; printf("Dirección de c: %p\n", &c); printf("Valor de c: %d\n\n", c); // 22 pc = &c; printf("Dirección del puntero pc: %p\n", pc); printf("Contenido del puntero pc: %d\n\n", *pc); // 22 c = 11; printf("Dirección del puntero pc: %p\n", pc); printf("Contenido del puntero pc: %d\n\n", *pc); // 11 *pc = 2; printf("Dirección de c: %p\n", &c); printf("Valor de c: %d\n\n", c); // 2 return 0; }
Resultado de la salida
Dirección de c: 003FFBF8 Valor de c: 22 Dirección del puntero pc: 003FFBF8 Contenido del puntero pc: 22 Dirección del puntero pc: 003FFBF8 Contenido del puntero pc: 11 Dirección de c: 003FFBF8 Valor de c: 2
Uso del programa
int* pc, c;
Aquí se crea un puntero pc y una variable común c, ambos de tipo int. Dado que pc y c no se inicializaron en un principio, el puntero pc apunta a una dirección sin asignar o a una dirección aleatoria. La variable c tiene una dirección, pero contiene valores basura aleatorios.
c = 22;
Esto es asignar un valor a la variable c22es decir,22se almacena en la memoria de la variable c.
pc = &c;
Esto asigna la dirección de la variable c al puntero pc.
c = 11;
Esto11asignado a la variable c.
*pc = 2;
Esto cambiará el valor de la ubicación de memoria a la que apunta el puntero pc2.
Supongamos que desea que el puntero pc apunte a la dirección de c. Luego,
int c, *pc; //pc es una dirección, pero c no lo es pc = c; // Error //&c es una dirección, pero* pc no es *pc = &c; // Error //&c y pc son direcciones pc = &c; //c y*Valor de pc *pc = c;
Este es un ejemplo que los principiantes de la sintaxis de punteros suelen encontrar confuso.
#include <stdio.h> int main() { int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; }
¿Por qué no se produjo un error al usar int *p = &c;?
porque
int *p = &c;
equivalente a
int *p: p = &c;
En estos dos casos, hemos creado un puntero p (no*p) y asignarle &c.
Para evitar esta confusión, podemos usar la siguiente instrucción:
int* p = &c;
Ahora que sabes lo que es un puntero, aprenderás en el siguiente tutorial la relación entre punteros y arreglos.