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
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:
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
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
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:
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:
| Concepto | Descripción |
|---|---|
| Aritmética de punteros | Se pueden realizar cuatro operaciones aritméticas con punteros: ++, --, +, - |
| Arreglo de punteros | Se pueden definir arreglos que almacenan punteros. |
| Puntero a puntero | C permite punteros a punteros. |
| Pasar punteros a funciones | Pasar 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 funciones | C permite que las funciones devuelvan punteros a variables locales, variables estáticas y memoria asignada dinámicamente. |