Una introducción a los punteros para los programadores
Tanto si cuenta o no, la gran mayoría de los programas que han utilizado hacer uso de punteros de alguna manera. Tal vez usted ha experimentado una Excepción de puntero nulo en algún momento. Como programador, código que escriba será más que probable uso punteros, incluso si no han implementado ellos usted mismo.
Hoy os voy a mostrar cómo funcionan los punteros, por lo que es posible que desee comprobar hacia fuera cómo las matrices y listas de trabajo para una imprimación de programación. Este artículo será más teoría basada de lo habitual, pero se pega con él, los punteros son muy complejos!Cómo matrices y listas de trabajo en PythonCómo matrices y listas de trabajo en PythonLas matrices y las listas son algunas de las estructuras de datos más útiles en la programación - aunque algunas personas los usan para su pleno potencial.Lee mas
Código compilación
Antes de la excavación en punteros, es necesario entender cómo el código está construido y ejecutado - tal vez usted ya sabe esto. Esta sección tendrá afirmaciones bastante generales - cosas que se aplican a la mayoria de idiomas, pero no necesariamente todos ellos.
Vídeo: Tutorial Programacion en C nº33 : Introduccion a Punteros
Vamos a tomar las cosas de nuevo al comienzo. cada ordenador utiliza binaria, una serie de unos y ceros que componen la tecnología moderna tal como la conocemos. Es extremadamente difícil de codificar nada en binario (los archivos serían muy confuso), ya que estas son las instrucciones primas que necesita su unidad Central de procesamiento o CPU funcione. Esto se conoce como Codigo de maquina.¿Qué es binario? [Tecnología Explicación]¿Qué es binario? [Tecnología Explicación]Teniendo en cuenta que binaria es tan absolutamente fundamental para la existencia de las computadoras, parece extraño que nunca hemos abordado el tema antes - por lo que hoy lo que pensaba que le daría una breve descripción de lo binario ...Lee mas
El siguiente paso después de código de máquina es Asamblea. Este es un formato legible algo humano. Aunque todavía es complejo programar en, es posible. El montaje se compone de una serie de comandos para ejecutar tareas sencillas, y es conocida como una nivel bajo lenguaje de programación. Es posible escribir programas complejos, pero es difícil de expresar conceptos abstractos, y requiere de mucha consideración.
Muchos juegos de vídeo y aplicaciones de alto rendimiento tienen parte de la lógica escrito en el montaje, ya que algunos aumentos reales de velocidad se pueden encontrar si usted sabe lo que está haciendo. Sin embargo, para la gran mayoría de los proyectos de programación, usted no necesita saber nada de ensamblaje en absoluto.
Así que si el código de máquina es demasiado difícil de escribir, y el conjunto es demasiado difícil de programar, lo que se escribe código con? Aquí es donde nivel alto vienen en idiomas. Los lenguajes de alto nivel hacen programas fáciles de escribir. Se puede programar en algo que se parezca a su lengua materna, y es fácil de expresar algoritmos complejos. Es posible que haya oído hablar de muchos lenguajes de alto nivel (y que sin duda ha utilizado un programa escrito en ellos):
- BASIC
- C ++
- Ceceo
Estos lenguajes son muy viejo, y muchos se han desarrollado en la década de 1950! Casi todos moderno lenguaje de programación es un lenguaje de alto nivel, incluyendo PHP y Python. Hay más idiomas están inventando todos los días (aunque es probable que haya suficiente por ahora), pero ¿cómo funciona exactamente el código todavía funcionan correctamente si las computadoras requieren código de máquina?
Aquí es donde entra en la compilación. Un compilador es un programa que convierte el código de alto nivel en una forma que pueda ser ejecutado. Este podría ser otro lenguaje de alto nivel, pero por lo general es el montaje. Algunos idiomas (como Python o Java) convertir el código en una etapa intermedia llamada código de bytes. Esto tendrá que compilar de nuevo en una fecha posterior, que normalmente se realiza en la demanda, por ejemplo, cuando se ejecuta el programa. Esto se conoce como justo a tiempo compilación, y es bastante popular.
Gestión de la memoria
Ahora que ya sabe cómo funcionan los lenguajes de programación, veamos gestión de memoria en lenguajes de alto nivel. Para estos ejemplos, voy a estar utilizando pseudo código - código no escrito en cualquier lenguaje específico, sino que se utiliza para mostrar los conceptos en lugar de sintaxis exacta. Hoy en día, esto será en su mayoría se asemejan a C ++ ya que es el mejor lenguaje de alto nivel (en mi opinión).
Para esta sección, le ayudará si usted tiene una comprensión de ¿Cómo funciona la memoria RAM.Un rápido & Guía sucia a la RAM: Lo que usted necesita saberUn rápido & Guía sucia a la RAM: Lo que usted necesita saberRAM es un componente crucial de todos los equipos, pero puede ser confuso para entender si usted no es un gurú de la tecnología. En este post, que analizarlas en términos de fácil comprensión.Lee mas
La mayoría de las lenguas tienen las variables - contenedores que almacenan algunos datos. Usted tiene que definir explícitamente el tipo de datos. Algunos lenguajes de tipos dinámicos como Python o PHP manejar esto para usted, pero todavía tienen que hacerlo.
Vídeo: Curso de punteros en C y C++, puntero es la variable que contiene la dirección de otra variable
Digamos que tiene una variable:
int myNumber-
Este código declara una variable llamada mi número, y le da un tipo de datos de entero. Una vez compilado, el ordenador interpreta este comando como:
“Encontrar algo de memoria vacía, y reservar un espacio lo suficientemente grande como para almacenar un entero”
Una vez ejecución de este comando, esa parte de la memoria no puede ser utilizado por otro programa. No contiene ningún dato, pero se reserva para la variable de myNumber.
Vídeo: Introduccion para Programadores
Ahora asignar un valor a la variable:
mi número = 10-
Para completar esta tarea, el equipo tiene acceso a su ubicación de memoria reservada, y cambios cualquier valor que se almacena allí, a este nuevo valor.
Ahora, esto es todo muy bien, pero ¿cómo obtener las posiciones de memoria sin reservas? Si los programas reservados toda la memoria que les gusta, la RAM se llenaría de inmediato - que haría para una muy sistema lento.
Para evitar este problema potencial, muchos idiomas implementar una recolector de basura, usado para destruir las variables (y por lo tanto liberar las posiciones de memoria reservadas) que han ido fuera del ámbito.
Usted puede preguntarse lo que el alcance es y por qué es tan importante. Ámbito de aplicación define los límites y la vida útil de variables o cualquier memoria utilizada por un programa. Una variable es “fuera de alcance” cuando se puede acceder ya no por cualquier código (que es cuando los pasos del colector de basura en). He aquí un ejemplo:
función matemáticas() {int FirstNumber = 1-}int secondNumber = 2-impresión(primer número + secondNumber)- // no trabajará
Este ejemplo no se compilará. La variable primer número está dentro de la matemáticas función, por lo que es su ámbito de aplicación. No se puede acceder desde fuera de la función en la que se ha declarado. Este es un concepto importante de programación, y la comprensión es crucial para trabajar con punteros.
Esta forma de gestión de memoria se llama la apilar. Es la forma en que la gran mayoría de los programas de trabajo. Usted no tiene que entender punteros para usarlo, y es bastante bien estructurado. La desventaja de la pila es la velocidad. A medida que el equipo tiene que asignar la memoria, realizar un seguimiento de las variables, y ejecutar la recolección de basura, hay una pequeña sobrecarga. Esto está bien para los programas más pequeños, pero ¿qué pasa con las tareas de alto rendimiento, o aplicaciones de datos pesadas?
Intro: punteros.
punteros
En la superficie, los punteros parecen sencillas. Que hacen referencia (apunta a) Un lugar en la memoria. Esto puede no parecer ningún diferentes a las variables “normales” en la pila, pero confía en mí, no hay una gran diferencia. Los punteros se almacenan en el montón. Esto es lo contrario de la pila - es menos organizada, pero es mucho más rápido.
Veamos cómo las variables se les asigna en la pila:
int NumberOne = 1-int NUMBERTWO = número uno-
Esto es simple la sintaxis La variable número dos contiene el número uno. Su valor se copia en todo durante la asignación de la número uno variable.
Si se quería obtener la dirección de memoria de una variable, en lugar de su valor, usted tiene que utilizar el signo ampersand (&). Esto se llama el Dirección de operador, y es una parte esencial de su caja de herramientas puntero.
int NumberOne = 1-int NUMBERTWO = &número uno-
Ahora el número dos variable puntos a una posición de memoria, en lugar de obtener el número uno copiado a través de su propia, nueva ubicación de memoria. Si se va a salida de esta variable, no sería el número uno (a pesar de que se almacena en la posición de memoria). Sería de salida que es la ubicación de memoria (probablemente algo así como 2167, aunque varía dependiendo del sistema y la memoria RAM disponible). Para acceder al valor almacenado en un puntero, en lugar de la posición de memoria, tiene que desreferenciar el puntero. Esto permite acceder al valor directamente, lo que sería el número uno en este caso. Aquí es cómo eliminar la referencia de un puntero:
int NUMBERTWO = *número uno-
los operador para deshacer referencias Es un asterisco (*).
Esto puede ser un concepto difícil de entender, por lo que vamos a repasar una vez más:
- los Dirección de operador (&) Almacena la dirección de memoria.
- los operador para deshacer referencias (*) Accede al valor.
Los cambios en la sintaxis ligeramente al declarar punteros:
int * MiPuntero-
El tipo de datos de int aquí se refiere al tipo de datos del puntero puntos a, y no el tipo del puntero en sí.
Ahora que ya sabe lo que son punteros, puede hacer algunos trucos realmente buenos con ellos! Cuando se utiliza la memoria, el sistema operativo se inicia secuencialmente. Se puede pensar en la RAM como los casilleros. Muchos agujeros para almacenar algo, solamente se puede usar uno a la vez. La diferencia aquí es que estos casilleros están todos contados. En la asignación de memoria, el sistema operativo se inicia en el número más bajo, y trabaja hacia arriba. Nunca va a saltar entre los números aleatorios.
Cuando se trabaja con punteros, si ha asignado una matriz, se puede navegar fácilmente al siguiente elemento por simple incrementando el puntero.
Aquí es donde se pone interesante. Cuando pasa valores a una función (usando variables almacenadas en la pila), estos valores se copian en su función. Si estos son grandes variables, el programa está almacenando ellos dos veces. Una vez finalizada su función, es posible que necesite una manera de devolver estos valores. Las funciones pueden devolver en general, sólo una cosa - así que lo que si quería volver dos, tres, o cuatro cosas?
Si pasa un puntero a su función, solo la dirección de memoria se copia (que es pequeña). Esto ahorra su CPU mucho trabajo! Tal vez sus puntero apunta a una enorme variedad de imagen - no sólo puede su trabajo en función de los mismos datos almacenados en la misma ubicación de memoria, pero una vez que se hace, no hay necesidad de devolver nada. ¡Ordenado!
Usted tiene que tener mucho cuidado sin embargo. Punteros todavía puede salir del alcance y ser recogidos por el recolector de basura. Los valores almacenados en la memoria, sin embargo, no se recogen. Esto se llama una pérdida de memoria. Ya no se puede acceder a los datos (como los punteros han sido destruidos), pero sigue siendo el uso de la memoria. Esta es una razón común para muchos programas se bloquee, y puede fallar espectacularmente si hay una gran cantidad de datos. La mayoría de las veces, su sistema operativo detendrá su programa si usted tiene una fuga grande (con más memoria RAM que el sistema tiene), pero eso no es deseable.
Vídeo: Febrero 2015: Teoría de Categorías para Programadores
punteros de depuración puede ser una pesadilla, sobre todo si se trabaja con grandes cantidades de datos, o trabajando en bucles. Sus desventajas y dificultades para comprender realmente valen las compensaciones que ganar en el rendimiento. Aunque recuerda, pueden no siempre ser requeridos.
Es todo por hoy. Espero que hayan aprendido algo útil sobre un tema complejo. Por supuesto, no hemos cubierto todo lo que hay que saber - que es un tema muy complejo. Si usted está interesado en aprender más, le recomiendo C ++ en 24 horas.
Si esto era un poco complejo, echar un vistazo a nuestra guía a los lenguajes de programación más fáciles.6 lenguajes de programación más fáciles de aprender para los principiantes6 lenguajes de programación más fáciles de aprender para los principiantesAprender a programar se trata de encontrar el lenguaje adecuado tanto como se trata el proceso de edificación. Estos son los seis mejores lenguajes de programación más fáciles para los principiantes.Lee mas
¿Has aprendido cómo funcionan los punteros de hoy? ¿Tienes algunos consejos y trucos que desea compartir con otros programadores? Saltar en los comentarios y compartir sus pensamientos abajo!