Код тут https://pastebin.com/Cct56huB
Интересуют комменты в строках 10 и 14.
Правильно ли они отражают суть происходящего в этих строках?
Может можно болеет точно/емко/кратко описать эту суть?
Как?
Спасибо огромное!
Думаю, что чем точнее формулировки в азах, тем лучше понимание всего предмета в целом.
А может посоветуете автора учебника, который разжевывает такие вещи? У меня как-то не получилось пока такого найти. спасибо!
Другие языки программирования и технологии
Учу самостоятельно Си как первый язык.
Только запись не в переменную, а в указатель. В УКАЗАТЕЛЬ! Это важно! Си - это язык низкого уровня. Если хочешь понять Си изнутри, смотри ассемблеровский листинг.
В отличие от подавляющего большинства языков программирования, в языке С ЗНАЧЕНИЕМ массива является не содержимое массива, а АДРЕС его начала (адрес элемента массива с индексом 0). Такой вот хак, придуманный авторами языка.
Потому parr = arr; присваивает parr значение arr, которое равно &arr[0].
P.S. Читать (и разбирать, что он делает) качественный чужой код - очень хороший способ учиться программированию. Но чтобы отличать качественный код от говнокода, необходимо уже иметь минимальный объём знаний и по каждой строчке кода задавать себе вопрос: "зачем она нужна?".
Потому parr = arr; присваивает parr значение arr, которое равно &arr[0].
P.S. Читать (и разбирать, что он делает) качественный чужой код - очень хороший способ учиться программированию. Но чтобы отличать качественный код от говнокода, необходимо уже иметь минимальный объём знаний и по каждой строчке кода задавать себе вопрос: "зачем она нужна?".
Роман Антипов
(с) Андрей
Но что бы различать качественный код от говнокода надо уметь очень хорошо программировать)))) парадокс
Но что бы различать качественный код от говнокода надо уметь очень хорошо программировать)))) парадокс
Андраник Казарян
Спасибо!
про то, что parr = arr; EQUALS parr = &arr[0]; знаю уже, даже не знаю, а спинным мозгом чувствую, то есть усвоено на 100 процентов.
Я учусь пока так : читаю учебник очень вдумчиво, а код прям до дыр вдумчиво, если возникают любые, самые мелкие вопросы - стараюсь придумать код, чтоб проверить. Все вариации на тему кода тоже стараюсь проверить.
Вот такой пример
char arr[SIZE] = "ten ten ten";
char *parr,*parr2;
parr = arr;
for(i=0;i<SIZE;i++)
printf("%c",*(parr+i));
В последней строчке мне было бы естественней применить *(parr++).
И я сразу начинаю думать, ПОЧЕМУ используют *(parr+i), ведь такой вариант менее нагляден.
Ну, со второго взгляда понимаю, что при моем варианте по окончании этого кусочка кода указатель будет не в начале, а в конце массива
:::::
про то, что parr = arr; EQUALS parr = &arr[0]; знаю уже, даже не знаю, а спинным мозгом чувствую, то есть усвоено на 100 процентов.
Я учусь пока так : читаю учебник очень вдумчиво, а код прям до дыр вдумчиво, если возникают любые, самые мелкие вопросы - стараюсь придумать код, чтоб проверить. Все вариации на тему кода тоже стараюсь проверить.
Вот такой пример
char arr[SIZE] = "ten ten ten";
char *parr,*parr2;
parr = arr;
for(i=0;i<SIZE;i++)
printf("%c",*(parr+i));
В последней строчке мне было бы естественней применить *(parr++).
И я сразу начинаю думать, ПОЧЕМУ используют *(parr+i), ведь такой вариант менее нагляден.
Ну, со второго взгляда понимаю, что при моем варианте по окончании этого кусочка кода указатель будет не в начале, а в конце массива
:::::
То формулировки синтаксиса языка. Не программирования. К программированию они ничуть не относятся
Чтобы добраться до сути программирования, не увязнув по пути в синтаксисе, обычно берут языки с очень простым синтаксисом, по типу паскаля или питона
Чтобы добраться до сути программирования, не увязнув по пути в синтаксисе, обычно берут языки с очень простым синтаксисом, по типу паскаля или питона
Разбирать чужие проги это очень плохой способ учиться программированию ((
Январь Январевич Всехвидящий
Почему? Ты смотришь на код программы, которую самому написать не хватает знаний и запоминаешь, понимаешь, учишься.
Комментарии правильные, но это одно и то же, записанное разными словами.
Имя массива == адрес массива == адрес первого элемента массива.
char arr[SIZE] = "one one one"; // Тут не надо указывать размер массива (в большинстве случаев)
char arr[] = "one one one";
Имя массива == адрес массива == адрес первого элемента массива.
char arr[SIZE] = "one one one"; // Тут не надо указывать размер массива (в большинстве случаев)
char arr[] = "one one one";
Андраник Казарян
Спасибо! а может можно все же как то более красиво, лаконично, ПРОФЕССИОНАЛЬНО выразить суть происходящего?
Результат присвоения идентичен, но путь разный. Именно чтоб и понять досконально этот путь я и придумыла эту прогу.
Результат присвоения идентичен, но путь разный. Именно чтоб и понять досконально этот путь я и придумыла эту прогу.
Суть отражают правильно. Но комментарии к единственному действию не только бесполезны, а даже вредны. Суть видна из самого действия. Вот если бы между 10 и 14 строкой parr изменялся, то в 14-й стоило бы указать, что-то типа "тут parr указывает на ..."
Андраник Казарян
Спасибо огромное за ответ!
Я поняла, в чем я ошиблась, задавая вопрос.
Надо было указать, что это мой код. И попросить выразить профессионально суть происходящего в строках 10 и 14. Я уверена, что студентам, изучающим программирование, должны эти формулировки давать обязательно, по крайней мере нормальные преподаватели. Мне лично именно эти формулировки дают возможность окончательно разложить по полочкам в голове какое-то понятие, по другому остается небольшая нечеткость, неуверенность. А это никуда не годится.
Я поняла, в чем я ошиблась, задавая вопрос.
Надо было указать, что это мой код. И попросить выразить профессионально суть происходящего в строках 10 и 14. Я уверена, что студентам, изучающим программирование, должны эти формулировки давать обязательно, по крайней мере нормальные преподаватели. Мне лично именно эти формулировки дают возможность окончательно разложить по полочкам в голове какое-то понятие, по другому остается небольшая нечеткость, неуверенность. А это никуда не годится.
Правильно. адрес переменной массива это адрес его первого элемента arr[0], но в си и си++ можно просто написать arr. если arr[0] это нулевой элемент массива, то &arr[0] это адрес где расположен этот элемент. так вот просто arr это и есть &arr[0].
с указателями примерно также. если *parr указывает на элемент, то parr указывает на адрес располажения этого элемента. если указатель указывает на адрес первого элемента массива то это значит что они ссылаются на одну и туже ячейку памяти. Для того что бы воспроизвести массив целиком, достаточно знать адрес его первого элемента, потому что массив хранится в памяти непрерывно и смещая адрес на единицу можно таким образом получить доступ к любому элементу массива через указатель.
с указателями примерно также. если *parr указывает на элемент, то parr указывает на адрес располажения этого элемента. если указатель указывает на адрес первого элемента массива то это значит что они ссылаются на одну и туже ячейку памяти. Для того что бы воспроизвести массив целиком, достаточно знать адрес его первого элемента, потому что массив хранится в памяти непрерывно и смещая адрес на единицу можно таким образом получить доступ к любому элементу массива через указатель.
Советую учиться по книге (С. Прата "Язык программирования Си"), а не по примерам. Указатели важнейшая тема в Си, и достаточно скользкая и мутная, дальше будет указатели на функции, указатели на указатели, массивы указателей и т. д - во всем этом нужно разбираться...
Танк *
Ну да... Одна из сложнейших тем, если не самая сложная.
Похожие вопросы
- язык си. задача по языку Си. Задаются коэффициенты системы из трёх линейных уравнений. Найти корни.
- Как учить английский язык программисту? Как учили вы? Когда заметили первый результат?
- Си, getchar() Изучаю самостоятельно Си, сейчас пытаюсь читать Кернигана и Ритчи (3-ье издание). Буксую конкретно
- Изучаю самостоятельно Си в CodeBlocks под Windows. Посоветуйте, пожалуйста, альтернативную IDE для изучения Си?
- Стоит ли учить яп Си (Не плюсы) в 2022 году?
- Интересно а на каком языке программирования была написана самая первая операционная система и самый первый язык?
- C++ учить, как?? Я так понял язык С++ состоит из разных команд, скриптов, а где учить эти команды и т. д?
- си царь всех языков! кто со мной согласен?
- Первый язык программирования.
- За сколько времени вы изучили свой первый язык программирования ?
Нашла ответ на вопрос, как генерировать листинг ассемблера в КодБлокс тут
https://stackoverflow.com/questions/20953907/how-to-generate-assembly-listings-in-codeblocks
Пишут, что если сделать соответственные изменения, то они не для единичного проекта, а для всех будут действовать. а я не уверена, подойдет ли мне такой вариант, и если не подойдет, и я анинсталлирую КодБлокс, а потом опять инсталлирую - перестанет ли генерироваться листинг ассемблера или нет. (я совсем в начале пути,).
Еще вариант предлагают - поставить копию компилятора и во второй копии компилятора генерировать листинги ассемблера. А я тоже не знаю, не начнут ли эти две копии компилятора между собой конфликтовать.
Думаю...