English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial básico de lenguaje C

Control de flujo de lenguaje C

Funciones en C

Arreglos en C

Punteros en C

Cadenas en C

Estructura de lenguaje C

Archivo de lenguaje C

C Otro

Manual de referencia de C

Punteros en C

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.

Direcció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.

Punteros en C

Los punteros (variables de puntero) son variables especiales utilizadas para almacenar direcciones en lugar de valores.

Sintaxis de puntero

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.

Asignar una dirección al puntero

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.

Obtener el valor apuntado por el puntero

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.

Cambiar el valor al que apunta el puntero

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.

Ejemplo: cómo funciona un puntero

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

  1. 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.  

  2. c = 22;

    Esto es asignar un valor a la variable c22es decir,22se almacena en la memoria de la variable c.
     

  3. pc = &c;

    Esto asigna la dirección de la variable c al puntero pc.
     

  4. c = 11;

    Esto11asignado a la variable c.
     

  5. *pc = 2;

    Esto cambiará el valor de la ubicación de memoria a la que apunta el puntero pc2.

Errores comunes al usar punteros

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.