さて、あなたのコードは構造体へのポインタではなく構造体を使用しています。あなたが求めることをする方法があります:以下を含みます:
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)には存在しないことに注意してください。
編集: 2文字のISO3166国コードを使用するようにアップグレードされました。また、名前付き構造を静的変数にしました。これらのシンボルは、以前はファイルの外部に表示されていなかったため(存在しなかったため)、現在はファイルの外部にも表示されていません。私は何かをconstにするかどうかを議論し、そうしないことに決めました-しかし、可能であればconstを使用することは一般的に良い考えです。また、この例では、3つの大陸に3つの国があります。1つの大陸(標準)に複数の国がある場合は、大陸の文字列を共有できるようにする必要があります。ただし、それを安全に(またはまったく)実行できるかどうかは、struct country_t
(指定されていない)詳細と、プログラムがテーブルの更新を許可されているかどうか(定数の質問に戻ります)によって異なります。