vectores punteros parametros matrices funciones como cadenas bidimensionales arreglos apuntadores c arrays pointers

parametros - Cuando se enseña C, ¿es mejor enseñar matrices antes o después de los punteros?



punteros y matrices en c (14)

Para aquellos de ustedes con experiencia en desarrollo curricular: ¿cuál es la mejor estrategia con respecto a los arreglos?

He visto algunas escuelas que enseñan matrices después de variables y estructuras de control, a menudo incluso antes de las funciones de enseñanza. Esto permite la enseñanza de algunos algoritmos rudimentarios, etc. Sin embargo, luego plantea el problema de cómo pasar matrices a las funciones, por lo que es necesario volver a las matrices, se enseñan los punteros y se reparan las cosas.

Otra opción es pasar de las variables y las estructuras de control a las funciones, y luego enseñarles los punteros, y una vez que tenga punteros, enseñe las matrices desde cero y luego use eso para llegar a la asignación de memoria dinámica.

Para mí, la segunda opción tiene más sentido, porque a diferencia de las variables simples, con las matrices es fácil "salir de los límites", pero los estudiantes que aún no aprendieron sobre la memoria y los indicadores pueden no entender qué hay fuera de estos límites.

Sin embargo, me interesa saber lo que piensan los demás.


¿Enseñarías punteros antes de las cuerdas?

Probablemente no. Y la mayoría de los mismos argumentos se aplican.

(Pero generalmente estoy de acuerdo con @legion, no lo pienses demasiado).


Como se indicó anteriormente, no creo que el orden sea importante, pero este es el orden que deseaba que alguien me hubiera mostrado las cosas.

  1. Arrays
  2. Punteros
  3. Cómo arrays y punteros son los mismos
  4. ¿Por qué las matrices y los punteros no son lo mismo?

Para obtener más información sobre el punto 4, realmente recomiendo el capítulo 4 "La verdad impactante: los arreglos C y los punteros no son lo mismo". en "Experto C, profundos secretos C".

/ Johan

Actualización :

Algunos enlaces al libro, y también hay una vista previa del libro. http://books.google.se - Expert C, deep C secrets

Y los comentarios de los usuarios sobre este libro son ciertos: http://www.amazon.co.uk/Expert-Programming-Peter-van-Linden/dp/0131774298


Creo que el mejor enfoque es introducir 1 concepto a la vez. No es necesario que el 100% explique las matrices en el primer módulo. Puedes desenredar casi cualquier cosa introduciendo 1 concepto a la vez.

Les enseñaría en este orden: matrices, punteros, matrices + punteros, otras cosas [N].

Arrays:

Primero puede enseñar matrices simples para que comprendan la capacidad de tener múltiples espacios de datos accesibles desde un solo nombre de variable.

//The following doesn''t need an understanding of pointers int x[10]; x[0] = 5;

Punteros:

Luego puedes enseñar sobre los punteros y cómo funcionan, comenzando con algunos ejemplos simples:

int y = 5; int *p = &y; *p = 6; printf("%i/n", y);

Asegúrese de dar un énfasis especial a que un puntero es como cualquier otra variable. Almacena una dirección de memoria.

No hay necesidad de entrar en el montón de pila por el momento.

Arrays + punteros:

Cómo iterar sobre matrices con punteros:

int x[10]; x[0] = 5; x[1] = 6; int *y = x; printf("%i/n", *y);//prints the first element y++; printf("%i/n", *y);//prints the second element

Entonces puedes enseñar cosas más complicadas ...

  • Cómo hacer aritmética de punteros.
  • Array + i taquigrafía para array [i]
  • Pasar matrices a funciones como arrays de puntos vs puntero param + tamaño param
  • Como los arrays son bloques continuos de memoria.
  • Explicación de cadenas literales, buffers, ...
  • Cómo funciona sizeof con los punteros frente a los tipos de matriz (tamaño del puntero frente al tamaño del búfer)
  • Explicar conceptos más complicados como asignar memoria, la pila y el montón
  • Múltiples niveles de indirección.
  • Referencias
  • Cómo funcionan las matrices multidimensionales
  • ...

En todos los ejemplos, haga un uso intensivo de las direcciones de tamaño e impresión. Realmente ayuda a entender lo que está pasando.


Creo que sería mejor comenzar con las matrices, porque el concepto de matriz es simple e intuitivo, pero en C sería importante revisar las matrices después de enseñar ponters, como sugirió antes la "Legión".


Deben ser enseñados al mismo tiempo.

El ejemplo de una matriz dimensional única a la que se accede como un puntero a la base con desplazamiento (tipo de tamaño * índice) debe aparecer.

es decir

a[i] is equivalent to *(a + i)


Depende de lo que sepan. ¿Estás enseñando C, o programación-y-C?

He visto muy poco éxito con este último. C simplemente no es un lenguaje muy intuitivo o perdonador. No he visto a los estudiantes agradecidos por comenzar con esto, aunque sí he visto estudiantes frustrados con la programación.

Los que van a seguir con la programación saldrán y aprenderán C en su tiempo libre, de todos modos. No hay necesidad de empujarlos primero.

Si solo estás enseñando C, y ellos ya conocen punteros y matrices, entonces enseñar cómo funcionan los punteros y matrices en C se puede hacer en una lección.


Enseño punteros antes de preocuparme por matrices. Sin embargo, normalmente, los estudiantes que veo, ya han sido expuestos a arreglos en su primera clase de CS en algún otro idioma. Sin embargo, incluso cuando estaba enseñando C en la primera clase de CS, hacía punteros antes de las matrices y describía matrices en términos de punteros. Solo porque está de moda en estos días pensar que "nadie va a necesitar o querer saber cómo funcionan realmente las computadoras" no significa que sea cierto.


Esta pregunta se puede hacer para cualquier lenguaje orientado a objetos realmente.

Cuando me enseñaron Java, primero me mostraron arrays y los punteros, como la última parte de los arrays, para demostrar la diferencia entre una copia profunda y una copia superficial.


No pienses demasiado en las cosas.

Enseñar estos conceptos de la manera más clara y atractiva posible es MUCHO más importante que en qué orden los hace.

Yo sugeriría tocar los conceptos básicos de las matrices primero, y hacer punteros y revisar matrices (más completamente esta vez) más adelante.


Pregunta interesante: espero que no sea demasiado tarde para responder.

Cuando enseñé programación en el Boston College a principios de los 80, mis colegas y yo luchamos con estos problemas todos los años y seguimos ajustando nuestro enfoque. C era un lenguaje nuevo entonces, así que nuestra progresión pasó de Básico a Pascal. Recuerdo que pensé en ese momento lo difícil que sería enseñar C solo porque era más relajado, había más formas para que los estudiantes se equivocaran, y más cosas realmente confusas, como la distinción entre matrices e indicadores que tenías que enseñar .

Lo que encontré más útil fue tratar de ser concreto, no abstracto. Por ejemplo, en el curso de programación de introducción utilicé un intérprete para una computadora decimal simple que usted programaría en su "lenguaje de máquina" decimal. Tenía direcciones que iban de 0 a 999, y códigos de operación como 1234, con el "1" que significa "agregar al acumulador", y "234" es la dirección de dónde encontrar el número a agregar. Los estudiantes escribirían programas realmente simples, como para sumar una lista de números, y los harían en un solo paso, observando lo que sucede en cada paso.

Les haría jugar con esto durante aproximadamente 3 semanas, y luego comenzar con BASIC. En el segundo curso, irían a Pascal. Lo que logró esa pequeña "computadora" decimal fue transmitir algunos conceptos concretos que hacen que las "abstracciones" en lenguajes "reales" sean mucho más fáciles de entender, tales como:

  • Qué es la memoria y qué son las direcciones, y cómo tanto los datos como los programas son solo números en las direcciones de la memoria. Eso hace que el concepto de "variable" y "matriz" y "puntero" sea mucho más fácil de explicar más adelante.
  • El modelo básico de cálculo es que los pasos muy simples se realizan en secuencia, y antes de que pueda comenzar cada paso, el anterior tiene que terminar. Sé que la gente se opondrá a que las computadoras estén altamente paralelizadas y canalizadas hoy en día, pero tengo que explicar que es necesario comenzar de manera muy simple, porque cuando los novatos ven que se ejecuta un programa, buscan todo el mundo como lo hace todo al mismo tiempo y lee Tu mente en el proceso.
  • Cómo, al combinar un vocabulario muy pequeño de instrucciones, que incluye saltos y saltos condicionales, puede hacer que la computadora haga casi cualquier cosa que desee.

Ahora, con respecto a C, he escuchado que ha sido menospreciado como un simple lenguaje de ensamblador, pero creo que eso es algo bueno. Siempre me pareció un lenguaje de expertos para expertos. Creo que las ideas de matrices y punteros y estructuras son muy fáciles de explicar si solo puede hacer referencia a la máquina subyacente. Del mismo modo para C ++ y programación orientada a objetos.

Entonces, para resumir, si los estudiantes comprenden el concepto subyacente de cómo funcionan las computadoras, incluso si se trata de una computadora realmente artificial, entonces es mucho más fácil explicar los conceptos de la estructura de datos de nivel superior.


Primero debe enseñar matrices, porque existen en casi cualquier otro idioma y son más fáciles de entender. Los punteros, o algunos aspectos de los punteros, se basan en lo que se aprendió sobre las matrices. Este es el orden orgánico, imho, y cómo lo aprendí hace mucho tiempo.


Si han estado expuestos al ensamblador de antemano, enseñe primero los punteros.

Si han estado expuestos a lenguajes de nivel superior (es decir, casi cualquier cosa), primero deben enseñar matrices.

En mi experiencia, las personas que llegan a C sin cierta exposición a la programación a nivel de ensamblaje (registros, direcciones, "fundamentos de la computadora") están a punto de entrar en un mundo de dolor. En mi humilde opinión, en realidad es mejor enseñar primero la codificación a nivel de ensamblaje y luego presentar C como un mejor ensamblador.


Supongo que estás enseñando C a estudiantes que ya saben cómo programar en otro idioma como Java (o en su época, Pascal). No creo que C sea un buen lenguaje para enseñar a programar a los principiantes.

Yo enseñaría primero los punteros. Esta es una de las ideas nuevas e importantes que se aprenderán en C. Ya sabrán el concepto de matrices de otros idiomas, por lo que no hay ninguna urgencia de enseñar esto primero. Entonces, cuando cubras arrays en C, puedes hablar de cómo son esencialmente azúcar sintáctica para aritmética de punteros, un concepto con el que ahora están familiarizados.


Yo enseñaría primero los punteros. Se pueden explicar sin enseñar matrices. Mientras enseñaba matrices, podría referirme a los indicadores al explicar la expresión a[i] , y al explicar cómo se pueden pasar a las funciones.