Comprenda completamente el puntero del lenguaje C en 1 minuto

Todos los datos en la computadora deben colocarse en la memoria. El número de bytes ocupados por diferentes tipos de datos es diferente. Por ejemplo, int toma 4 bytes y char toma 1 byte. Para acceder a estos datos correctamente, cada byte debe estar numerado, al igual que el número de la casa y el número de identificación, cada número de byte es único y se puede encontrar un determinado byte con precisión en función del número.

La figura 4G es la memoria para cada número de bytes (en hexadecimal):
El número de cada byte en la memoria 4G

Llamamos al número de bytes de dirección de memoria (Dirección) o puntero (puntero). La dirección aumenta en orden desde 0. Para un entorno de 32 bits, el programa puede usar 4 GB de memoria, la dirección más pequeña es 0 y la dirección más grande es 0XFFFFFFFF.

El siguiente código muestra cómo generar una dirección:

  1. #include <stdio.h>
  2. int main () {
  3. int a = 100 ;
  4. char str [ 20 ] = "c.biancheng.net" ;
  5. printf ( "% # X,% # X \ n " , & a , str );
  6. devuelve 0 ;
  7. }

Resultado de la operación:
0X28FF3C, 0X28FF10

%#Xsignifica salida en forma hexadecimal, con prefijo 0X. a es una variable, utilizada para almacenar enteros, debe agregarla al frente &para obtener su dirección; la cadena en sí representa la primera dirección de la cadena, no necesita agregarla &.

Lenguaje C tiene un carácter de control %p , dedicado a la compra de componentes de dirección en formato hexadecimal, pero el formato de salida p% no es uniforme, con un poco de compilador 0x prefijo, algunos sin, por lo que aquí no usamos.

Todo es una direccion

El lenguaje C utiliza variables para almacenar datos y funciones para definir un fragmento de código que se puede reutilizar. Eventualmente deben colocarse en la memoria para que la CPU las use.

Tanto los datos como el código se almacenan en la memoria en forma binaria, y la computadora no puede distinguir en el formato si una pieza de memoria almacena datos o código. Cuando el programa se carga en la memoria, el sistema operativo asignará diferentes permisos a diferentes bloques de memoria. Los bloques de memoria con permisos de lectura y ejecución son el código, mientras que los permisos de lectura y escritura (solo pueden tener permisos de lectura) El bloque de memoria son los datos.

La CPU solo puede obtener el código y los datos en la memoria a través de la dirección. Durante la ejecución del programa, se informará a la CPU del código que se ejecutará y de la dirección de los datos que se leerán y escribirán. Si el programa comete un error accidentalmente, o el desarrollador lo hace intencionalmente, cuando la CPU quiera escribir datos, proporcione una dirección en el área de código y se producirá un error de acceso a la memoria. Este tipo de error de acceso a la memoria será interceptado por el hardware y el sistema operativo, obligando al programa a fallar, y el programador no tiene ninguna posibilidad de salvación.

¡Cuando la CPU accede a la memoria, necesita direcciones, no nombres de variables y nombres de funciones! Los nombres de variables y nombres de funciones son solo una especie de dirección mnemónica. Cuando el archivo fuente se compila y se vincula a un programa ejecutable, se reemplazarán por direcciones. Una tarea importante del proceso de compilación y enlace es encontrar las direcciones correspondientes a estos nombres.

Suponiendo que las direcciones de las variables a, byc en la memoria son 0X1000, 0X2000 y 0X3000, respectivamente, la operación de suma c = a + b;se convertirá en una forma similar a la siguiente:

0X3000 = (0X1000) + (0X2000);

( )Representa la operación de valor. La expresión completa significa tomar los valores en las direcciones 0X1000 y 0X2000, agregarlos y asignar el resultado de la adición al

nombre de la variable de memoria y el nombre de la función en la dirección 0X3000. Brindamos comodidad, permítanos En el proceso de escribir código, puede usar cadenas en inglés que sean fáciles de leer y comprender. No tiene que enfrentarse directamente a la dirección binaria.

Cabe señalar que, aunque los nombres de variables, nombres de funciones, nombres de cadenas y nombres de matrices son esencialmente los mismos, todos son mnemotécnicos de direcciones, pero en el proceso de escribir código, creemos que los nombres de variables representan los datos en sí , Y el nombre de la función, el nombre de la cadena y el nombre de la matriz representan la primera dirección del bloque de código o bloque de datos.

Supongo que te gusta

Origin www.cnblogs.com/sea520/p/12678536.html
Recomendado
Clasificación