Подтвердить что ты не робот

Когда вы учите C, лучше ли преподавать массивы до или после указателей?

Для тех из вас, у кого есть опыт разработки учебного плана: что является лучшей стратегией в отношении массивов?

Я видел некоторые школы, которые учат массивы после переменных и структур управления, часто перед тем, как преподавать функции. Это позволяет преподавать некоторые рудиментарные алгоритмы и т.д. Однако в нем возникает проблема передачи массивов в функции, поэтому необходимо вернуться к массивам, чтобы указатели обучались и исправляли вещи.

Другой вариант - перейти от переменных и структур управления к функциям, а затем научить указателям, а после того, как у вас есть указатели, научите массивы с нуля, а затем используйте их, чтобы перейти к распределению динамической памяти.

Для меня второй вариант имеет больше смысла, потому что в отличие от простых переменных, с массивами легко "выйти за пределы", но студенты, которые еще не узнали о памяти и указателях, могут не понимать, что лежит за пределами этих границ.

Однако мне интересно узнать, что думают другие.

4b9b3361

Ответ 1

Я думаю, что лучшим подходом является введение по одной концепции за один раз. Вам не нужно 100% объяснять массивы в первом модуле. Вы можете развязать почти все, вводя 1 концепцию за раз.

Я бы научил их в следующем порядке: Массивы, указатели, массивы + указатели, OtherStuff [N].


Массивы:

Сначала вы можете преподавать простые массивы, чтобы они понимали возможность доступа к нескольким слотам данных из одного имени переменной.

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

Указатели

Затем вы можете учить о указателях и способах их работы, начиная с некоторых простых примеров:

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

Удостоверьтесь, что особое внимание уделяется тому, что указатель подобен любой другой переменной. Он сохраняет адрес памяти.

Пока нет необходимости входить в стек против кучи.


<сильные > Массивы + Указатели:

Как перебрать массивы с указателями:

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

Затем вы можете учить более сложные вещи...

  • Как сделать арифметику указателя.
  • Сокращение массива + я для массива [i]
  • Передача массивов в функции в виде массивов с указателем param + size пары
  • Как массивы являются непрерывными блоками памяти
  • Объясните строковые литералы, буферы,...
  • Как sizeof работает с указателями против типов массивов (размер указателя и размер буфера)
  • Объясните более сложные концепции, такие как выделение памяти, стек и куча
  • Несколько уровней косвенности
  • Ссылки
  • Как работают многомерные массивы.
  • ...

Во всех примерах широко используются адреса sizeof и печати. Это действительно помогает понять, что происходит.

Ответ 2

Сначала я бы учил указателям. Их можно объяснить, не обучая массивов. Во время обучения массивам я мог ссылаться на указатели при объяснении выражения a[i], а также при объяснении того, как передать их функции.

Ответ 3

Не переусердствуйте.

Преподавание этих понятий как можно более четко и привлекательно - это более важно, чем то, в каком порядке вы их делаете.

Я бы предложил сначала прикоснуться к основам массивов, а затем сделать указатели и пересмотреть массивы (более полно на этот раз).

Ответ 4

Сначала вы должны научить массивы, потому что они существуют практически на любом другом языке и их легче понять. Указатели или некоторые аспекты указателей основываются на том, что было известно о массивах. Это органический порядок, imho, и как я узнал его еще раз, когда.

Ответ 5

Их следует преподавать одновременно.

Пример одномерного массива, к которому обращаются как указатель на базу со смещением (indexize * index), должен появиться.

то есть.

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

Ответ 6

Я предполагаю, что вы преподаете C студентам, которые уже знают, как программировать на другом языке, таком как Java (или еще в мой день, Pascal). Я не думаю, что C - хороший язык для обучения программированию для новичков.

Сначала я бы учил указателям. Это одна из важных новых идей, которые будут изучаться на C. Они уже будут знать концепцию массивов с других языков, поэтому нет необходимости преподавать это в первую очередь. Поэтому, когда вы накладываете массивы на C, вы можете говорить о том, как они представляют собой синтаксический сахар для арифметики указателей, концепцию, с которой они теперь знакомы.

Ответ 7

Я преподаю указатели, прежде чем беспокоюсь о массивах. Однако, как правило, студенты, которых я вижу, они уже были подвергнуты массивам в своем первом классе CS на каком-то другом языке. Однако даже я преподавал C в первом классе CS, я бы сделал указатели перед массивами и описал массивы с точки зрения указателей. Просто потому, что в наши дни модно думать, что "никто никогда не понадобится или не хочет знать, как работают компьютеры на самом деле", это не значит, что это правда.

Ответ 8

Как указано выше, я не думаю, что порядок важен, но это тот порядок, который я хотел бы, чтобы кто-нибудь показал мне материал.

  • Массивы
  • Указатели
  • Как массивы и указатели одинаковы
  • Почему массивы и указатели не являются одинаковыми.

Для получения дополнительной информации о пункте 4 я действительно рекомендую глава 4 "Шокирующая правда: C-массивы и указатели - это не то же самое!" в "Expert C, глубокие секреты C".

/Johan


Обновление

Некоторые ссылки на книгу, а также предварительный просмотр книги. http://books.google.se - эксперт C, глубокие секреты C

И комментарии пользователя об этой книге верны: http://www.amazon.co.uk/Expert-Programming-Peter-van-Linden/dp/0131774298

Ответ 9

Если они раньше были подвергнуты ассемблеру, сначала научите указателям.

Если они были подвергнуты воздействию языков более высокого уровня (то есть почти ничего), сначала научите массивы.

По моему опыту люди, приходящие на C без какого-либо воздействия на программирование уровня сборки (регистры, адреса, "основы для компьютеров" ), собираются войти в мир боли. ИМХО, вы на самом деле лучше учите кодирование уровня сборки, а затем вводите C в качестве лучшего ассемблера.

Ответ 10

Интересный вопрос - надеюсь, еще не поздно ответить.

Когда я преподавал программирование в Бостонском колледже в начале 80-х, мои коллеги и я боролись с этими проблемами каждый год, и мы постоянно настраивали наш подход. Тогда C был новым языком, поэтому наша прогрессия прошла через Basic to Pascal. Я помню, что в то время я думал о том, как трудно было бы учить C только потому, что это было более рыхло-гусиным, было больше возможностей для студентов испортить и еще более запутывать такие вещи, как различие между массивами и указателями, которые вы должны были преподавать.

То, что я нашел наиболее полезным, было попыткой быть конкретным, а не абстрактным. Например, в курсе интро-программирования я использовал интерпретатор для простого десятичного компьютера, который вы бы запрограммировали в нем десятичный "машинный язык". У него были адреса от 0 до 999 и коды порядка 1234, причем значение "1" означает "добавить к аккумулятору", а "234" - адрес того, где можно найти номер для добавления. Студенты пишут очень простые программы, например, чтобы добавить список чисел, и они будут делать одноэтапные действия, наблюдая, что происходит на каждом шагу.

Я хотел бы, чтобы они играли с этим около 3 недель, а затем начали с BASIC. Во втором курсе они отправились в Паскаль. То, что сделал этот маленький десятичный "компьютер", состояло в том, чтобы передать некоторые конкретные концепции, которые значительно облегчают понимание "абстракций" на "реальных" языках, таких как:

  • Какая память и какие адреса, и как данные и программы являются просто цифрами по адресам в памяти. Это значительно упрощает объяснение понятия "переменная" и "массив" и "указатель" позже.
  • Как основная модель вычислений состоит в том, что очень простые шаги выполняются последовательно, и прежде чем каждый шаг может начаться, предыдущий должен закончить. Я знаю, что люди будут возражать против того, что компьютеры в настоящее время сильно распараллелены и конвейерны, но я должен объяснить, что вам нужно начинать очень просто, потому что, когда новички видят запуск программы, он ищет весь мир, как будто он делает все сразу, и читает ваш ум в этом процессе.
  • Как, объединив очень маленький словарь инструкций, включая прыжки и условные прыжки, вы можете заставить компьютер делать почти все, что вы хотите.

Теперь, в отношении C, я слышал, что это унизительно, как просто вырезание над языком ассемблера, но я думаю, что это хорошо. Меня всегда привлекали эксперты для экспертов. Я думаю, что идеи массивов и указателей и структур очень легко объяснить, если вы можете просто вернуться к базовой машине. Аналогично для С++ и объектно-ориентированного программирования.

Итак, чтобы обобщить, если ученики понимают базовую концепцию работы компьютеров, даже если это действительно искусственный компьютер, то объяснение концепций структуры более высокого уровня намного проще.

Ответ 11

Зависит от того, что они знают. Вы преподаете C, или программирование и-C?

Я видел очень мало успеха с последним. C - это просто не очень интуитивный или прощающий язык. Я не видел, чтобы студенты были благодарны за то, что начали с этого, хотя я видел, как студенты разочарованы программированием для него.

Те, кто собирается придерживаться программирования, выйдут и научутся C в свое свободное время. Нет необходимости сначала нажимать на них.

Если вы просто учите C, и они уже знают указатели и массивы, то обучение тому, как указатели и массивы работают на C, можно сделать на одном уроке.

Ответ 12

Не могли бы вы преподавать указатели перед строками?

Наверное, нет. И применяются те же самые аргументы.

(Но, как правило, я согласен с @legion - не переусердствуйте.)

Ответ 13

Я думаю, что лучше начать с массивов, потому что концепция массива проста и интуитивно понятна, но в C было бы важно пересмотреть массивы после обучения понтеров, как это предлагал ранее "Легион".

Ответ 14

Этот вопрос может быть задан для любого объектно-ориентированного языка.

Когда мне преподавали Java, я впервые показал массивы и указатели, как последнюю часть массивов, чтобы продемонстрировать разницу между глубокой копией и мелкой копией.