Другие языки программирования и технологии

Учу самостоятельно Си как первый язык.

Код тут https://pastebin.com/Cct56huB
Интересуют комменты в строках 10 и 14.
Правильно ли они отражают суть происходящего в этих строках?
Может можно болеет точно/емко/кратко описать эту суть?
Как?
Спасибо огромное!
Думаю, что чем точнее формулировки в азах, тем лучше понимание всего предмета в целом.
А может посоветуете автора учебника, который разжевывает такие вещи? У меня как-то не получилось пока такого найти. спасибо!
Только запись не в переменную, а в указатель. В УКАЗАТЕЛЬ! Это важно! Си - это язык низкого уровня. Если хочешь понять Си изнутри, смотри ассемблеровский листинг.
Саша Дубовик
Саша Дубовик
26 548
Лучший ответ
Андраник Казарян Спасибо за подсказку! да, очень интересно с ассемблеровским листингом разобраться!
Нашла ответ на вопрос, как генерировать листинг ассемблера в КодБлокс тут
https://stackoverflow.com/questions/20953907/how-to-generate-assembly-listings-in-codeblocks
Пишут, что если сделать соответственные изменения, то они не для единичного проекта, а для всех будут действовать. а я не уверена, подойдет ли мне такой вариант, и если не подойдет, и я анинсталлирую КодБлокс, а потом опять инсталлирую - перестанет ли генерироваться листинг ассемблера или нет. (я совсем в начале пути,).
Еще вариант предлагают - поставить копию компилятора и во второй копии компилятора генерировать листинги ассемблера. А я тоже не знаю, не начнут ли эти две копии компилятора между собой конфликтовать.
Думаю...
В отличие от подавляющего большинства языков программирования, в языке С ЗНАЧЕНИЕМ массива является не содержимое массива, а АДРЕС его начала (адрес элемента массива с индексом 0). Такой вот хак, придуманный авторами языка.

Потому 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), ведь такой вариант менее нагляден.
Ну, со второго взгляда понимаю, что при моем варианте по окончании этого кусочка кода указатель будет не в начале, а в конце массива
:::::
То формулировки синтаксиса языка. Не программирования. К программированию они ничуть не относятся
Чтобы добраться до сути программирования, не увязнув по пути в синтаксисе, обычно берут языки с очень простым синтаксисом, по типу паскаля или питона
Разбирать чужие проги это очень плохой способ учиться программированию ((
Январь Январевич Всехвидящий Почему? Ты смотришь на код программы, которую самому написать не хватает знаний и запоминаешь, понимаешь, учишься.
Комментарии правильные, но это одно и то же, записанное разными словами.
Имя массива == адрес массива == адрес первого элемента массива.

char arr[SIZE] = "one one one"; // Тут не надо указывать размер массива (в большинстве случаев)
char arr[] = "one one one";
Андраник Казарян Спасибо! а может можно все же как то более красиво, лаконично, ПРОФЕССИОНАЛЬНО выразить суть происходящего?
Результат присвоения идентичен, но путь разный. Именно чтоб и понять досконально этот путь я и придумыла эту прогу.
Суть отражают правильно. Но комментарии к единственному действию не только бесполезны, а даже вредны. Суть видна из самого действия. Вот если бы между 10 и 14 строкой parr изменялся, то в 14-й стоило бы указать, что-то типа "тут parr указывает на ..."
Ал
Александр
25 516
Андраник Казарян Спасибо огромное за ответ!
Я поняла, в чем я ошиблась, задавая вопрос.
Надо было указать, что это мой код. И попросить выразить профессионально суть происходящего в строках 10 и 14. Я уверена, что студентам, изучающим программирование, должны эти формулировки давать обязательно, по крайней мере нормальные преподаватели. Мне лично именно эти формулировки дают возможность окончательно разложить по полочкам в голове какое-то понятие, по другому остается небольшая нечеткость, неуверенность. А это никуда не годится.
Правильно. адрес переменной массива это адрес его первого элемента arr[0], но в си и си++ можно просто написать arr. если arr[0] это нулевой элемент массива, то &arr[0] это адрес где расположен этот элемент. так вот просто arr это и есть &arr[0].
с указателями примерно также. если *parr указывает на элемент, то parr указывает на адрес располажения этого элемента. если указатель указывает на адрес первого элемента массива то это значит что они ссылаются на одну и туже ячейку памяти. Для того что бы воспроизвести массив целиком, достаточно знать адрес его первого элемента, потому что массив хранится в памяти непрерывно и смещая адрес на единицу можно таким образом получить доступ к любому элементу массива через указатель.
Т*
Танк *
10 755
Советую учиться по книге (С. Прата "Язык программирования Си"), а не по примерам. Указатели важнейшая тема в Си, и достаточно скользкая и мутная, дальше будет указатели на функции, указатели на указатели, массивы указателей и т. д - во всем этом нужно разбираться...
()
(Серж )
8 452
Танк * Ну да... Одна из сложнейших тем, если не самая сложная.