¿Cuál es la mejor manera de aprender punteros en C?

El concepto de punteros no es tan difícil como se describe. Solo piense en un puntero como una flecha que apunta a una ubicación de memoria.

Por ejemplo, supongamos que vas a la casa de tu amigo por primera vez. Aunque sabes el camino, no estás muy seguro de ello. Así que, en su camino, sigue pidiendo instrucciones a los distintos individuos. Ahora, estas personas le indican una dirección según su descripción de la dirección. En C, estas personas que te apuntan en la dirección correcta / la casa de un amigo pueden considerarse como indicadores. Aunque hay una cosa que señalar es que tienen la referencia / dirección que lo ayuda a buscar el lugar correcto para los datos.

En C, los punteros son las referencias a la ubicación de la memoria. Puede pensar que es una variable que apunta a la ubicación de memoria real de la variable apuntada. Normalmente, se utilizan dos símbolos con los punteros: ‘*’ (asterisco) y ‘&’ y “comercial”). Ahora, ‘*’ significa puntero (puede pensarse como una flecha que apunta en una dirección, posiblemente a un valor) y ‘&’ significa dirección de (un valor / variable).

Sintaxis para una declaración de puntero:
int * ptr;
int a = 1;
ptr = & a;

La primera línea declara un puntero de tipo entero, es decir, un puntero que contiene la referencia de una variable entera. La segunda línea declara e inicializa una variable entera ‘a’. La tercera línea es donde ocurre la magia, aquí estamos almacenando la referencia de la variable ‘a’ en el puntero ‘ptr’. Puede leer esta línea como: el valor de ‘ptr’ es igual a la dirección de ‘a’.

Con todo, solo piense en ellos como instrucciones para llegar a la ubicación de la memoria y estará bien.

Aprende un poco de lenguaje ensamblador. No tiene que ser para ninguna CPU o arquitectura a la que esté destinado su código C. Los punteros en C son simplemente una extensión de la parte natural de la arquitectura de la CPU. En esencia, exponen parte de la semántica del conjunto de instrucciones de la CPU como elementos del lenguaje en el lenguaje C. Los principios son virtualmente idénticos, siendo la excepción principal la aritmética de punteros.

Puede encontrar emuladores para muchos tipos diferentes de CPU en línea. Si elige uno como el modo real x86 que usa MS-DOS y la versión anterior de Windows, es probable que también encuentre un poco de código de muestra y tutoriales para ayudarle. No era infrecuente escribir cuerpos significativos de código en el ensamblador para esa arquitectura de destino en el pasado.

Solo imagine que un puntero es un tipo especial de caja que contiene la dirección de otra caja. El otro cuadro puede ser cualquier variable simple, variable compleja como una estructura o una matriz o una función o el primer elemento de una matriz. Siempre que necesite trabajar con la segunda casilla, en su lugar, simplemente utilizará el puntero con un operador de indirección, como * ptr. Si entiende este punto simple y recuerda aplicarlo, puede entender cualquier concepto de puntero muy fácilmente. Puntero de entrada, puntero de estructura, punteros de función, punteros de matriz, todos son simples cuadros que contienen las direcciones de esos. Y estos cuadros especiales tienen una dirección, que también se puede almacenar en otra caja, que no es más que un puntero a un concepto de puntero.

Aprende matrices primero.

Luego, imagine la RAM como una matriz gigante de bytes y punteros a caracteres como variables que mantienen índices en esa matriz. Excepto que algunos rangos de índice no se pueden usar, y otros rangos de índice están siendo utilizados por otros. Esto debería llevarlo a preguntarse cómo puede uno saber qué “índices” puede usar y cuáles no, y así presentarle la administración de la memoria y el diseño de un programa en la memoria.

Luego, pregúntese cómo podría almacenar un entero de 32 bits en una matriz de bytes indexados de tal manera. Y luego un entero de 64 bits. Y luego estructuras más complejas, y así sucesivamente. Esto debería hacerte entender por qué los punteros tienen tipos (es decir, porque el compilador necesita saber cuántos bytes leer / escribir) y cómo funciona realmente un encasillado.

Lo anterior es una simplificación, por supuesto, pero no está tan lejos de la realidad.

La mejor manera de aprender algo es hacerlo. Practique el uso de punteros en un programa de muestra (no es un proyecto de trabajo). Es posible que explote su computadora y necesite reiniciarla, pero eso le enseñará lo que NO debe hacer lol. Primero lea algunos artículos: ponga en práctica los conceptos utilizando lo que aprendió. Además, haz algunas cosas que cualquier tutorial decente diga que no, y estudia los resultados. Encuentro las manos en la codificación mejor que leer un montón de material para tratar de envolver mi cabeza alrededor de algo. Si descubres algo que no funcionó como pensabas, investiga y descubre por qué … hay muchos sitios, pero te recomendaría usar Stack Overflow. Es genial recibir ayuda con algunas de las preguntas más difíciles que pueda tener. Recuerda, estudia primero y luego haz preguntas. Google es tu amigo.

La declaración de apertura de esto solo es suficiente para hacer que quieras probarlo (insértese la cara de risa / llanto): Los punteros en C. Comienzan con “los punteros en C son fáciles y divertidos de aprender”. El dolor y la angustia vendrán más tarde a medida que aprendas lo que no debes hacer.

Los punteros en C son una parte tan comúnmente usada del lenguaje que después de programar en el lenguaje por un tiempo, es probable que olvide que los está usando. Hasta que creas un error serio. Pero una buena higiene de punteros te ayudará en esos momentos.

Yo sugeriría comenzar creando una lista enlazada simple. Una vez que tenga las funciones de insertar, eliminar y agregar funciones, intente implementar una rutina de clasificación. Realmente creo que si puedes ordenar una lista enlazada, entonces te pillarán los punteros.

Si desea más que el próximo, intente implementar un árbol de búsqueda binario, ¿puede hacer que se equilibre automáticamente? ¡Que te diviertas!

Comprenda que un puntero de datos en C es esencialmente un índice en una matriz.

int a [10];

int * p = & a [0]; // p se refiere a [0].

Ya que es un índice en una matriz, podemos agregarle un número entero para llegar a los otros elementos de la matriz.

int * q = p + 1; // q se refiere a un [1].

A continuación, comprenda que todos los objetos de datos en C se almacenan efectivamente en arreglos.

int x; // x se almacena efectivamente en una matriz int [1] – llamémosla xa.

int * r = & x; // r se refiere a xa [0], que es x.

Como los punteros son índices en matrices, la mayoría de las relaciones entre los punteros solo son significativas para los punteros en la misma matriz.

int b [10];

Podemos hacer la pregunta & a [0] <& a [1] de manera significativa.

Pero & a [0] <& b [0] no tiene sentido.

La memoria en C no es una matriz plana de bytes, sino que se segmenta en matrices discretas.

Si entiendes estas cosas, entonces los punteros son bastante sencillos, pero desafortunadamente muy pocos programadores de C lo hacen.

Esto significa que los punteros generalmente se enseñan utilizando modelos que son confusos porque son incorrectos, o describen cómo funciona una implementación en particular, y por lo tanto no tienen sentido dada la semántica de C real.

Creo que podrías aprender a usar archivos primero
Lo forzará a usar punteros sin comprenderlos completamente, para el final tendrá un buen entendimiento de la idea básica de cómo usarlos.
Los archivos te permiten jugar un poco y tener un objetivo más claro, ¡y también son realmente útiles! Si ya sabe cómo usarlos, regrese e intente comprender qué sucede con el puntero del archivo.
No necesita aprender un idioma diferente solo para entender los punteros, solo obtenga la idea básica y continúe desde allí. Los punteros pueden ser realmente desafiantes, así que tómatelo con calma y trate de no apurarlo.

Debería preguntarme qué situación necesito para usar el puntero. El puntero es una herramienta de dirección de memoria que representa los datos complejos mediante una expresión simple, así que olvídese de la mejor manera de aprender y solo de usarla.

Iniciar un proyecto y empezar a usar punteros. La mejor manera de aprender algo es usándolo. No hay mejor manera de aprender sobre alguna técnica que con la práctica.

Escribe código! Lo más seguro es que veas errores de puntero (incluso podrías bloquear tu computadora (aunque eso es mucho más difícil de hacer ahora …), pero eventualmente lo resolverás.

Entonces estará listo para abordar punteros a punteros y punteros a funciones.