QUOTE (_Ivana @ Mar 1 2012, 17:38)

0.5) в
объявленииCODE
extern our_struct const s1;
порядок указания типа и директивы "const" не имеет значения? Вроде проверил и так и так, работают оба варианта.
Да, не имеют.
Однако обратите внимание, что char const * Variable; char * const Variable; и char const * const Variable; - три объявления совершенно разных указателей. Аналогично с квалификатором volatile и квалификаторами адресных пространств (если они имеются в качестве расширения языка) наподобие __flash, __eeprom.
QUOTE (_Ivana @ Mar 1 2012, 17:38)

1) в том же объявлении у меня в варианте 2-х файлов вообще нет директивы "const". Проверил без этой директивы в варианте от Сергей Борщ - тоже работает.
Если у вас нет const ни в строке extern our_struct s1; ни в строке const our_struct s1 = {'A', &s2}; - тоже все нормально. Если только в первой - по идее должна быть ошибка. Ведь вы обманули компилятор - вы сказали, что в s1 можно писать, а потом объявили ее константной. Опять же, если вы уберете const у
struct our const *s_our; - вы не сможете присвоить этому полю адрес константной s2 или s1. Похоже именно на это и наткнулся ваш товарищ. В Си существует правило неявного приведения типов - указателю на константную переменную можно присвоить адрес неконстантного объекта (этим вы лишь ограничиваете операции доступа к такой переменной операциями чтения), но указателю на неконстантную переменную нельзя присвоить адрес константной переменной - тем самым вы разрешали бы через этот указатель операции записи в константную переменную, а это уже жульничество, для него существуют явные приведения типа, которые надо использовать тогда и лишь только тогда, когда такое жульничество необходимо и осознанно.
QUOTE (_Ivana @ Mar 1 2012, 17:38)

На такие мысли меня натолкнули Керриган с Риччи - написано, что объявление говорит о том, что переменная обладает определенными свойствами (в основном типом),
Да, совершенно верно. И свойство"нельзя писать" - такое же неотъемлемое, как и размер, тип или знаковость. Ведь компилятор должен на основе этого объявления проверять ваши обращения к этой переменной и использовать (где необходимо) правиля неявного приведения типов.
QUOTE (_Ivana @ Mar 1 2012, 17:38)

а при определении выделяется для нее место в памяти. Если это так, тогда в объявлении можно не указывать "const", поскольку это относится к выделению места в памяти.
Вы глубоко ошибаетесь. В вашей писюге все программы, включая константы и исполняемый код, целиком размещаются в ОЗУ. И const на это повлиять не может при всем желании. Сам по себе квалификатор const никакой магии не несет -
он лишь заставляет компилятор проверять, не пытаетесь ли вы записать в такую переменную. То, что для некоторых процессоров такую переменную можно разместить во флешь и не копировать перед исполнением в ОЗУ, реализуется исключительно средствами линкера. Компилятор об этом совершенно ничего не знает.