C Punteros

Aprender punteros en C es a la vez simple e interesante. Con los punteros, se puede simplificar la ejecución de algunas tareas de programación en C, y hay algunas tareas, como la asignación dinámica de memoria, que no se pueden realizar sin punteros. Por lo tanto, para convertirse en un buen programador de C, es necesario aprender punteros.

Como usted sabe, cada variable tiene una ubicación de memoria, y cada ubicación de memoria define una dirección accesible mediante el&operador para acceder a la dirección, que representa una dirección en la memoria.

Vea el siguiente ejemplo, que mostrará la dirección de la variable definida:

Ejemplo

#include <stdio.h> int main () { int var_ejemplo = 10; int *p; // Definir variable de puntero p = &var_ejemplo; printf("Dirección de la variable var_ejemplo: %p\n", p); return 0; }

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

var_ejemplo 变量的地址: 0x7ffeeaae08d8

A través del ejemplo anterior, hemos aprendido qué es una dirección de memoria y cómo acceder a ella. A continuación, veamos qué es un puntero.

¿Qué es un puntero?

Un puntero es una dirección de memoria; una variable de puntero es una variable que se utiliza para almacenar direcciones de memoria. Al igual que otras variables o constantes, debe declarar el puntero antes de usarlo para almacenar la dirección de otra variable. La forma general de declaración de una variable de puntero es:

type *var_name;

Aquí,typees el tipo base del puntero, que debe ser un tipo de datos válido de C,var_namees el nombre de la variable de puntero. El asterisco utilizado para declarar punteros*es el mismo asterisco que se usa en la multiplicación. Sin embargo, en esta declaración, el asterisco se usa para especificar que una variable es un puntero. Las siguientes son declaraciones de puntero válidas:

int *ip; /*Un puntero de tipo entero*/ double *dp; /*Un puntero de tipo double*/ float *fp; /*Un puntero de tipo flotante*/ char *ch; /*Un puntero de tipo carácter*/

Todos los tipos de datos reales, ya sean enteros, flotantes, caracteres u otros tipos de datos, el tipo de valor correspondiente al puntero es el mismo: todos son un número hexadecimal largo que representa una dirección de memoria.

La única diferencia entre punteros de diferentes tipos de datos es el tipo de datos de la variable o constante a la que apunta el puntero.

¿Cómo usar punteros?

Al usar punteros, se realizan con frecuencia las siguientes operaciones: definir una variable de puntero, asignar la dirección de una variable al puntero y acceder al valor en la dirección disponible en la variable de puntero. Esto se hace mediante el operador unario*para devolver el valor de la variable en la dirección especificada por el operando. El siguiente ejemplo involucra estas operaciones:

Ejemplo

#include <stdio.h> int main () { int var = 20; /*Declaración de la variable real*/ int *ip; /*Declaración de la variable de puntero*/ ip = &var; /*Almacenar la dirección de var en la variable de puntero*/ printf("Dirección de la variable var: %p\n", &var ); /*La dirección almacenada en la variable de puntero*/ printf("La dirección almacenada en la variable ip: %p\n", ip ); /*Acceder al valor usando el puntero*/ printf("El valor de la variable *ip: %d\n", *ip ); return 0; }

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

var 变量的地址: 0x7ffeeef168d8
ip 变量存储的地址: 0x7ffeeef168d8
*ip 变量的值: 20

El puntero NULL en C

Al declarar una variable, si no hay una dirección exacta para asignar, asignar un valor NULL a la variable de puntero es una buena práctica de programación. Los punteros a los que se les asigna el valor NULL se denominanVacíopunteros NULL.

El puntero NULL es una constante con valor cero definida en la biblioteca estándar. Vea el siguiente programa:

Ejemplo

#include <stdio.h> int main () { int *ptr = NULL; printf("La dirección de ptr es %p\n", ptr ); return 0; }

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

ptr 的地址是 0x0

En la mayoría de los sistemas operativos, los programas no pueden acceder a la memoria en la dirección 0, porque esa memoria está reservada por el sistema operativo. Sin embargo, la dirección de memoria 0 tiene un significado especial: indica que el puntero no apunta a una ubicación de memoria accesible. Pero por convención, si el puntero contiene un valor nulo (cero), se asume que no apunta a nada.

Para comprobar si hay un puntero nulo, puede usar una sentencia if, como se muestra a continuación:

if(ptr) /*Si p no es nulo, entonces*/ if(!ptr) /*Si p es nulo, entonces*/

Detalles de los punteros en C

En C, hay muchos conceptos relacionados con punteros. Estos conceptos son simples pero muy importantes. A continuación se enumeran algunos conceptos importantes relacionados con punteros que los programadores de C deben tener claros:

ConceptoDescripción
Aritmética de punterosSe pueden realizar cuatro operaciones aritméticas con punteros: ++, --, +, -
Arreglo de punterosSe pueden definir arreglos que almacenan punteros.
Puntero a punteroC permite punteros a punteros.
Pasar punteros a funcionesPasar parámetros por referencia o por dirección, de modo que los parámetros pasados se modifiquen en la función llamada.
Devolver punteros desde funcionesC permite que las funciones devuelvan punteros a variables locales, variables estáticas y memoria asignada dinámicamente.
Otras extensiones