Ответ 1
Ну, ваш код использует структуры, а не указатели на структуры. Есть способы делать то, что вы ищете, в том числе:
static struct country_t us = { "United States of America", "America" };
static struct country_t uk = { "England", "Europe" };
static struct country_t et = { "Ethiopia", "Africa" };
struct country_t *countries[] = { &us, &uk, &et, };
Существуют другие способы сделать это с помощью назначенных инициализаторов и сложных литералов на C99. Раздел 6.5.2.5 "Составные литералы" показывает способ:
struct country_t *countries[] =
{
&(struct country_t) { "United States of America", "America" },
&(struct country_t) { "England", "Europe" },
&(struct country_t) { "Ethiopia", "Africa" },
};
Стандарт иллюстрирует указатели на структуры с вызовом функции. Имейте в виду, что не все компиляторы C принимают синтаксис C99, и эти составные литералы не присутствуют на C89 (aka C90).
Изменить: обновлено для использования двухбуквенных кодов стран ISO 3166. Также сделанные именованные структуры статическими переменными - эти символы не были видны за пределами файла раньше (потому что они не существовали), и теперь они также не видны за пределами файла после. Я обсуждал, делать ли что-нибудь const и не решил - но использование const, когда вы можете, обычно является хорошей идеей. Кроме того, в этом примере есть 3 страны на 3 континентах. Если бы у вас было несколько стран на одном континенте (норма), вы могли бы захотеть поделиться континентами. Однако, независимо от того, можете ли вы сделать это безопасно (или вообще), зависит от деталей struct country_t
(которые не были указаны) и о том, разрешено ли программе обновлять таблицу (которая возвращается к вопросу о константе).