Esta no es la típica pregunta de quienes odian los punteros, sino más bien una pregunta muy interesante.
Los punteros son un concepto muy poderoso, pero eso es lo que son: un concepto. Entonces, ¿por qué se inventó el compilador de C con una pieza de lógica y sintaxis tan aislada dedicada a los punteros?
No me malinterpretes, me encantan las oportunidades que nos brindan los punteros y su sintaxis actual. Son una característica absolutamente esencial, ya que han logrado la evolución de estructuras de datos dinámicas, objetos y clases, el intercambio de memoria multiproceso, la mutabilidad de objetos, la duplicación de valores con baja redundancia y mucho más.
Pero si imaginamos el acontecimiento de la invención de C, los punteros tal como son hoy en día parecen una idea mucho más impresionante que un primer concepto intuitivo. Echemos un vistazo más profundo a lo que quiero decir.
Si observa la estructura de un puntero, es básicamente un largo sin firmar (también conocido como 4 [sistema de 32 bits] u 8 bytes en la memoria). Lo que separa los punteros de los largos sin firmar son las características específicas del puntero.
Un puntero tiene su propia sintaxis de declaración y tiene su operador propio: el desreferenciador.
int a = 5; int *ptr = &a; //declaration int value = *ptr; //dereference
Pero imaginemos que esto nunca se inventó. Entonces lo siguiente sería fácilmente posible si la función de desreferenciación estuviera asociada con cualquier tipo de entero:
int a = 5; unsigned long adress = &a; int value = *adress;
En ese caso, incluso podrías hacer cosas como esta:
int firstIntInMemory = *(0); //manually dereferences (4bytes at) adress 0`
Hablando del analizador, esta no es en absoluto una sintaxis conflictiva ya que la estrella como desrefrencer es un operador unario mientras que la estrella como multiplicador aritmético es siempre un operador binario.
Este operador de desreferenciación ficticio, como lo describí anteriormente, es en realidad la esencia pura del concepto de puntero. Comparar esto con la implementación real actual hace que sea interesante pensar en la pregunta principal. Podría haber habido muchos resultados.
Lo único especial que hace la aritmética de punteros es tener en cuenta el tamaño de las letras en los cálculos. Cuando tengo una matriz y quiero obtener el segundo elemento, simplemente agrego 1 al puntero. Si es un puntero int, esto implícitamente agregará un valor de 4 a la dirección (si sizeof(int) == 4 en su sistema):
int arr[5] = {1,2,3,4,5}; int second = *(arr 1);
Pero seamos honestos, lo siguiente es mucho más lógico si piensas intuitivamente en la memoria:
int arr[5] = {1,2,3,4,5}; int second = *(arr sizeof(int));
Y esto sería simplemente aritmética entera estándar. Si lo miras de esta manera, en realidad no hay ninguna razón para haber inventado la aritmética de punteros.
Por supuesto, la sintaxis '*' hace que los usos previstos sean mucho más claros. Si lo ve, inmediatamente sabrá que esta variable se utiliza para la manipulación de la memoria. Además, todas las funciones de la biblioteca de manipulación de memoria están diseñadas para punteros.
Pero aún así, si nunca se hubiera inventado y en su lugar tuviéramos estos largos sin firmar desreferenciables, la gente simplemente habría ideado convenciones de diseño y nomenclatura, como agregar identificadores de variables de puntero con un sufijo '_p'. Y las bibliotecas de manipulación de memoria simplemente habrían evolucionado en torno a esto.
Entonces, si lo piensas bien, C podría haber sobrevivido de la misma manera que lo hace ahora si los punteros nunca se hubieran inventado como una característica del lenguaje. Los programadores simplemente los inventarían como un concepto y funcionarían de la misma manera que existen actualmente.
Me parece una historia interesante para investigar más a fondo.
¿Por qué C inventó el puntero?
¿Fue simplemente la razón que esperábamos: coherencia, claridad y seguridad contra el uso indebido de la desreferenciación?
¿O hay una razón más profunda y una lógica mucho más compleja que la forma en que cubrí los punteros en esta publicación, lo que los hace en realidad significativamente más eficientes que hacer lo mismo con números enteros de propósito general?
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3