Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

Dominando punteros en C: Tutorial práctico guiado por expertos

Dominando punteros en C

Explore los conceptos fundamentales de los punteros en C, desde direcciones de memoria hasta ejemplos prácticos y errores comunes. Escrito para desarrolladores que desean profundizar su comprensión con código real.

Los punteros son una piedra angular de la programación eficiente en C. Antes de sumergirnos en los punteros, revisemos cómo funcionan las direcciones de memoria en C.


Direcciones de memoria en C

Si tiene una variable var, la expresión &var produce la dirección donde se almacena var.

La manipulación de direcciones aparece frecuentemente, por ejemplo en scanf():

scanf("%d", &var);

Esto almacena la entrada del usuario directamente en la ubicación de memoria de var. Una demostración rápida:

#include <stdio.h>
int main() {
    int var = 5;
    printf("var: %d\n", var);
    printf("dirección de var: %p", &var);
    return 0;
}

Salida

var: 5
dirección de var: 0x7fffc1a2b1c8

Nota: La dirección será diferente en cada ejecución y sistema.


¿Qué es un puntero?

Un puntero es una variable que almacena una dirección de memoria en lugar de un valor convencional. Al almacenar direcciones, los punteros permiten el acceso indirecto a los datos, habilitando la gestión dinámica de memoria, estructuras de datos eficientes y control de bajo nivel del sistema.

Declaración de punteros

Sintaxis típica de declaración:

int *p;

Variaciones comunes:

int *p1; int *p2;

El espaciado alrededor del asterisco no afecta la declaración. Sin embargo, tenga cuidado con declaraciones separadas por comas:

int *p1, p2; /* p1 es un puntero, p2 es un int */

Asignar direcciones a punteros

Ejemplo:

int *pc, c;
c = 5;
pc = &c;

Aquí, c recibe el valor 5, y pc almacena la dirección de c.


Desreferenciar punteros

Para acceder al valor almacenado en la dirección a la que apunta un puntero, use el operador de desreferencia *:

int *pc, c;
c = 5;
pc = &c;
printf("%d", *pc); /* Imprime 5 */

Recuerde, pc es el puntero; *pc recupera el valor al que apunta. Intentar asignar una dirección a *pc (ej. *pc = &c;) es inválido.

El operador * se conoce como operador de desreferencia.


Modificar valores a través de punteros

Puede cambiar los datos subyacentes mediante su puntero:

int *pc, c;
c = 5;
pc = &c;
*pc = 1; /* c se convierte en 1 */
printf("%d", c); /* Imprime 1 */

Múltiples variables pueden compartir el mismo puntero tras reasignación:

int *pc, c, d;
c = 5;
d = -15;
pc = &c;
printf("%d", *pc); /* 5 */
pc = &d;
printf("%d", *pc); /* -15 */

Ejemplo práctico

Ejecute este programa completo para observar cómo los valores de los punteros permanecen constantes mientras los datos a los que referencian pueden cambiar:

#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);
    pc = &c;
    printf("Dirección del puntero pc: %p\n", pc);
    printf("Contenido del puntero pc: %d\n\n", *pc);
    c = 11;
    printf("Dirección del puntero pc: %p\n", pc);
    printf("Contenido del puntero pc: %d\n\n", *pc);
    *pc = 2;
    printf("Dirección de c: %p\n", &c);
    printf("Valor de c: %d\n\n", c);
    return 0;
}

Salida

Dirección de c: 0x7fffc1a2b1c8
Valor de c: 22
Dirección del puntero pc: 0x7fffc1a2b1c8
Contenido del puntero pc: 22
Dirección del puntero pc: 0x7fffc1a2b1c8
Contenido del puntero pc: 11
Dirección de c: 0x7fffc1a2b1c8
Valor de c: 2

Explicación

  1. int *pc, c; – declara un puntero pc y un int c.
  2. c = 22; – almacena 22 en la memoria de c.
  3. pc = &c; – apunta pc a c.
  4. c = 11; – actualiza el valor mediante acceso directo.
  5. *pc = 2; – cambia el valor a través del puntero.

Errores comunes con punteros

Errores típicos incluyen confundir punteros y valores:

int c, *pc;
// Incorrecto – asigna un valor a un puntero
pc = c; // Error
// Incorrecto – intenta asignar una dirección al puntero desreferenciado
*pc = &c; // Error
// Correcto – asignar dirección al puntero
pc = &c; // OK
// Correcto – asignar valor a la ubicación apuntada
*pc = c; // OK

Para principiantes, la sintaxis int *p = &c; puede ser confusa. Es equivalente a:

int *p;
p = &c;

Escribirlo como int* p = &c; reduce la ambigüedad.


Ahora que comprende los punteros, estará listo para explorar su relación con los arrays en el siguiente tutorial.

Lenguaje C

  1. C# Hola Mundo – Construyendo su primera aplicación en C#
  2. Entendiendo palabras clave e identificadores en C#: Reglas, listas y mejores prácticas
  3. Domine variables y tipos de datos primitivos en C#: Guía completa
  4. Operadores en C# – Guía completa de operadores en C#
  5. Dominando operadores bit a bit y de desplazamiento en C#: Guía completa
  6. Fundamentos de C#: Entrada y salida esenciales
  7. Expresiones, sentencias y bloques en C#: Guía completa con ejemplos prácticos
  8. Dominando los comentarios en C#: Tipos, mejores prácticas y documentación XML
  9. Dominando punteros en C: Tutorial práctico guiado por expertos
  10. Entendiendo la relación entre arrays y punteros en C
  11. Programación en C: Pasar direcciones y punteros a funciones – Guía práctica