Estoy tan abrumado por los punteros en C, hay demasiada sintaxis allí. ¿Cómo los entiendo bien?

Un puntero es solo otro tipo de variable. Almacena la dirección de otra cosa. La necesidad de punteros es importante para comprenderlos.

Digamos que tienes algo grande en la memoria como una imagen o un archivo de audio. No desea mover mucho esa imagen en la memoria porque mover grandes cantidades de memoria requiere más tiempo y recursos que pasar una sola palabra o puntero. Entonces, el mejor método es cargar la imagen en la memoria y pasar la ubicación de esa imagen a quien necesite acceder a ella. Esto puede ser una analogía tonta, pero no muda su casa a la oficina de correos si espera una entrega, les da su dirección.

Trabajar con las direcciones de grandes cosas en la memoria, y no solo con sus valores literales, se hace con tanta frecuencia que los procesadores tienen instrucciones específicas para usar direcciones. Así es también como funciona el sistema de memoria en una computadora: hay cables conectados a chips de memoria que llevan la dirección, y otros que llevan los valores de datos. Piense en los punteros como las cosas que almacenan los valores que se colocan en el bus de direcciones.

C tiene el operador * para usar el valor en una variable como una dirección y no un valor literal. Esto significa que si tiene una variable que está almacenando la dirección de algo y coloca * delante, le está diciendo al compilador que use el valor almacenado en esa variable como una dirección a otro valor en otro lugar de la memoria.

Usar el operador & delante de una variable hace lo contrario. El uso de este carácter le dice al compilador que desea trabajar con la dirección, o ubicación en la memoria, de lo que sea que le ponga delante.

Existe un peligro si lo usa incorrectamente. Si usa el operador * delante de una variable que no almacena una dirección, es probable que obtenga un valor sin sentido, o si intenta escribir en él, obtendrá un error de segmentación y su programa se bloqueará. La computadora solo está haciendo lo que le dices, así que debes tener cuidado de no intentar escribir en la memoria que no te pertenece. Antes de los sistemas operativos modernos, como en DOS o Mas OS <9, el sistema operativo no le impedía escribir en la memoria que no era suya, por lo que era fácil bloquear toda la computadora, no solo su propio programa.

Puede almacenar la dirección de algo en cualquier tipo de variable, siempre que tenga el tamaño correcto. Esto no significa que * debas * pero significa que es posible. Por ejemplo, en una máquina de 32 bits, puedo almacenar la dirección de algo en un flotante de 32 bits, porque es solo otro valor de 32 bits. Puede hacer esto con un casting complicado, y no es una buena idea, pero solo muestra que un puntero es solo otro valor.

Obtener el concepto básico es importante, pero en realidad puede obtener el concepto básico simplemente practicando el uso de punteros y leyendo ocasionalmente un breve resumen (como las otras respuestas aquí) de lo que son.

Compare punteros con fracciones, por ejemplo (¡aunque no literalmente!); probablemente entiendas cómo trabajar con fracciones y hacer sumas con ellas. Pero no vuelves a los conceptos básicos cada vez que lo haces. Los conceptos básicos están ahí si los necesita, pero si siempre tuviera que pensar en ellos, sería increíblemente lento con las fracciones.

¿Cómo se enteró de las fracciones? En su mayoría, sus maestros simplemente lo perforaron en fracciones, practicando multiplicaciones, sumas, etc. Más tarde se siente automático y “obvio”.

Entonces, si buscas en Google ejemplos y tutoriales simples que involucren punteros, y escribes ese código y lo haces funcionar, y ves si puedes idear algo que haga lo mismo pero de manera muy diferente, etc. eventualmente sabrás de inmediato qué el asterisco o el signo de unión van a donde y los conceptos subyacentes serán mucho más fáciles de entender.

Al principio puede ser difícil, pero sigue practicando poco a poco y muy pronto lo dominarás.

Un puntero simplemente almacena la dirección de una variable y la defensa del puntero devuelve el valor almacenado en esa dirección. Francamente, no creo que haya mucha sintaxis allí. Comience con algunos programas de muestra y aumente.

A continuación hay algunos recursos que encontré útiles, échales un vistazo, también podrían ayudarte.

1) http://cslibrary.stanford.edu/10

2) http://cslibrary.stanford.edu/10

3) http://cslibrary.stanford.edu/10

4) http://cslibrary.stanford.edu/11

5) http://cslibrary.stanford.edu/10

Para los conceptos básicos del puntero, el primer enlace es más que suficiente, pero le recomiendo que trabaje hasta el tercer enlace (LinkedListProblem) a) esto es bueno para la práctica e involucra todos los conceptos básicos y la manipulación del puntero anterior yb) aprende mucho sobre la lista enlazada (si no los conoces, los árboles también si vas más allá)

Enlace original => Stanford CS Ed Library

Además, las soluciones se proporcionan al final en caso de que se atasque.

¡Feliz codificación!

Tuve un problema similar con Pascal, pero en ese caso ya entendí un poco sobre los punteros.

Si ya conoce algún lenguaje orientado a objetos (C ++ sería lo mejor en este caso), entonces considere una instancia de un objeto como ‘algo que se señala’.

En lugar de sentirse abrumado, asegúrese de comprender las estructuras de datos, como las listas vinculadas en un lenguaje OO, donde los punteros están bajo el capó. Por entender, me refiero a implementar en lo que mejor sepas, y usar.

Dibuje imágenes de cualquier estructura que tenga punteros cuando traduzca esto al código C.

Sobre todo, da un paso a la vez. Entiéndelos un poco primero; camina antes de correr y todo eso.

Solo tenga en cuenta que un puntero es solo una variable regular que contiene una referencia como su valor. Las variables normales tienen un valor ‘normal’. Ahora, para usar la referencia que es el valor almacenado en el puntero, usamos el operador de referencia. En C este es el * operador. Desreferenciar significa ‘usar la referencia almacenada en la variable de puntero para acceder al valor almacenado en la variable referida’. Si desea que un puntero haga referencia a una variable, entonces indique al compilador que “tome la referencia a una variable y almacénela”. En C esto se hace con el operador &.

Eso es básicamente todo lo que hay que hacer.

Olvídate de la sintaxis. Todo es un concepto: podemos mantener un puntero en una variable. Todo lo demás es polaco.

Ahora, ese puntero puede apuntar a cualquier número de tipos de variables diferentes. Necesitamos mucha sintaxis para describir el tipo de cosa a la que apunta. Pero al final del día, es solo memoria.

Parece que lo que estás luchando son las reglas de sintaxis para declarar diferentes tipos de punteros. Como programador en C, no me preocupé demasiado por eso, porque en la mayoría de los casos, solo trataba con punteros simples o dobles para char, int, long, float o algún tipo de estructura, etc. Era realmente raro si Me ocupé de otros casos de punteros, y en esos casos, me referí a un manual en C, fui a la sección de punteros, y eso me ayudó a entender lo que estaba viendo o cómo declarar un puntero a un tipo raro de estructura Estaba lidiando en el momento. En mi experiencia, no fue un gran problema como lo que pretendes que sea.

Puede que le guste este manual sobre punteros en C que escribí en 1992:

C punteros explicados, realmente

Algunas personas que habían programado en C durante años me dijeron que entendían los punteros y la sintaxis del puntero C solo después de leer mi publicación.

Cuando aprendí sobre la gestión de la memoria, dibujé estructuras en una pizarra y papel. Me ayudó a hacer un seguimiento de lo esencial cuando se trata de implementar funciones de limpieza y cosas por el estilo. Pero luego pude visualizar las estructuras en mi cabeza.

La sintaxis no es importante, tiene la red mundial para cuando se olvida, pero es bueno saber cómo visualizar datos en su mente. (incluso si necesita usar lápiz y papel a veces).