Ну, ваш код использует структуры, а не указатели на структуры. Есть способы сделать то, что вы ищете, в том числе:
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 (он же C90).
Редактировать: Обновлен для использования двухбуквенных кодов стран ISO 3166. Также преобразовал именованные структуры в статические переменные - эти символы раньше не были видны вне файла (потому что они не существовали), а теперь они не видны и вне файла. Я подумал, стоит ли делать что-нибудь const, и решил не делать этого, но использование const, когда это возможно, - хорошая идея. Также, в примере, есть 3 страны на 3 континентах. Если бы у вас было несколько стран на одном континенте (норма), вы могли бы захотеть разделить строки континента. Однако то, можете ли вы сделать это безопасно (или вообще), зависит от деталей struct country_t
(которые не были указаны) и от того, разрешено ли программе обновлять таблицу (что возвращает к вопросу о постоянстве ).