¿Cómo se utilizan los punteros para la asignación dinámica de memoria de las variables?

Para usar eficientemente la memoria disponible, los programadores usan punteros que apuntan a otra variable.

Esto reduce el requisito de memoria para el programa durante el tiempo de ejecución. Hay varias ocasiones en que los punteros ahorran memoria y aceleran el programa.

  1. Matriz de tamaño fijo : el tamaño de la matriz es fijo y no usamos el uso completo de la matriz la mayor parte del tiempo. El espacio ocupado restante se desperdicia. Por lo tanto, si usa una lista vinculada, puede aumentar o reducir la lista utilizando solo la memoria que desea usar.
  2. Pasar parámetro de función : cuando se pasa una variable como parámetro a una función, se envía una copia de la variable a la función que no es económica. Pasar parámetros usando el puntero es más rápido y mejor.

Hay dos pasos muy importantes para usar un puntero.

  1. Declare el tipo de puntero (por ejemplo, int, float, etc.). El tipo de puntero determina el tamaño de memoria dinámica que se asignará.
  2. El puntero debe apuntar a una variable antes de usarla, de lo contrario obtendrá un error.

Las operaciones de puntero son operaciones en tiempo de ejecución : adquiere memoria en tiempo de ejecución y libera la memoria después de que finaliza el programa.

Bueno, no sé qué tanto de programación en lenguaje ensamblador o diseño de microprocesador conoces, pero si supongo un conocimiento de nivel universitario del diseño de microprocesador, sabrías que hay un registro para mantener la dirección de la siguiente ubicación de memoria desde donde lee los datos, así como el código de operación. No hay diferencia entre cómo se ven los datos y la dirección de la ubicación donde se encuentran los datos, todos son un montón de ceros y unos. Entonces, el procesador tiene buses de direcciones y buses de datos.

La semántica de un lenguaje informático es donde se encuentran principalmente los detalles del hardware, que también determinan qué tan portátiles pueden ser los programas en general. Los punteros son variables que contienen la dirección de la variable en lugar del valor de la variable. En C, puede pasar valores a funciones y la función que llama a otra función con un valor tiene que mantener el tipo de retorno de la función llamada. Esto se convierte en una fuente importante de errores de tipo que el compilador debe enfrentar cuando las funciones se vuelven más y más largas y las funciones de llamada llaman a varias funciones y variables que se guardan aquí o allá. También existe el factor “por valor” en el que las funciones llamadas utilizan las variables que les pasan las funciones de llamada. Entonces, una característica de C es tipo void *. Y también hay sindicatos. Los punteros, por lo tanto, también se pueden utilizar para mantener el valor sin tipo; Esto significa que si el valor de la variable después de una expresión es mayor que 4 bytes, el tipo puede cambiar de int a double, o alguna expresión puede devolver un flotante o un número con l / L en el sufijo, etc. y el puntero podrá manejarlo mientras se usa para operaciones como * ++ s, etc. De lo contrario, es posible que deba colocar una operación de conversión como (void) cuando la variable a la que se le asigna el valor de no confunde al compilador cuando intenta crear un token de eso.

La asignación de memoria dinámica para una variable se puede explicar en dos niveles:

A. Nivel de lenguaje: donde hablamos de cómo la inicialización de una matriz en una o múltiples dimensiones sin un tamaño predefinido lo mantiene creciendo y la llamada a la matriz es básicamente la dirección del primer elemento de la matriz, podría ser un schar o wchat_t como bueno, la misma idea eventualmente.

B. Nivel de asignación de disco: aquí hablamos sobre cómo funcionan malloc () y realloc (), cómo pueden llamarse solo como punteros y cómo también buscan fd (descriptor de archivo). Esto es una discusión demasiado complicada y se lo dejaría a usted.

Esta respuesta no está completa, puede ser una milla o dos cortas todavía. Pero los punteros siempre son la primera opción para realizar operaciones aritméticas en lugar de en la propia variable real. Por supuesto, el alcance de la variable afecta la utilidad de un puntero en lugar de la elección obvia del valor de la variable en sí.

Oh sí … los punteros se utilizan para la asignación dinámica de memoria.

Para cualquier proceso, básicamente hay cuatro partes en la memoria.

Los segmentos de datos y códigos se utilizan para almacenar datos y códigos. Stack se usa para llamadas a funciones internas y funciones recursivas y muchos otros propósitos como evaluación de expresiones, etc. Puede crecer y encogerse también.
Viniendo al montón …
Su memoria libre asignada al proceso / subproceso para la asignación dinámica en tiempo de ejecución. Entonces, siempre que llame a malloc (en lenguaje C) o nuevo (en C ++) o cualquier otra palabra clave para eso, en realidad estamos pidiendo un montón de memoria del montón, si está disponible. Y siempre que sea libre (en C) o elimine (en C ++) o cualquier otra palabra clave, en realidad libera esa porción de memoria para su uso posterior. A medida que el proceso finaliza, se libera.

Espero que esto aclare tu duda.

More Interesting

Cómo encontrar un algoritmo eficiente para un problema

¿Qué algoritmo de extracción de características es adecuado para el reconocimiento facial basado en video?

¿Qué estructura de datos debo usar para completar esta tarea?

¿Necesitamos un algoritmo 10 veces más rápido o una máquina 10 veces más rápida? Da una razón para justificar tu respuesta.

¿Cuáles son algunos conceptos que debo saber antes de aprender programación dinámica?

¿Es cierto que si entendemos los algoritmos podemos entender todos los programas difíciles de todos los idiomas?

¿Es posible aplicar de manera eficiente algoritmos de aprendizaje automático para problemas de optimización combinatoria?

Dada una matriz que contiene enteros distintos, ¿cuál es el número promedio de veces que se establece el valor máximo del elemento al encontrarlo?

Dada una lista de palabras, ¿encuentra cuántas veces aparece cada palabra en los 20000 archivos dados?

Cómo acceder a la raíz de un árbol binario si está almacenado en una estructura

¿Cómo debo entender los "Teoremas de no almuerzo gratis para la optimización"?

¿Cuál de los enfoques (conexionismo, evolutivo, bayesiano, etc.) tendrá la mejor oportunidad de desarrollar un algoritmo maestro de IA?

¿Puedo encontrar el camino hamiltoniano más corto en un gráfico completo ponderado no dirigido en tiempo polinómico (donde todos los pesos no son negativos)?

¿Por qué no hay soluciones a pedido de Hadoop para múltiples inquilinos?

La solución de este problema Problema - C - Codeforces es este Ideone.com pero ¿qué está sucediendo dentro con los punteros, especialmente las líneas 27, 28, 36?