Thinkers'Studio
JavaとC言語の自習ツール
配列の要素数を調べるには( C言語版 )

 C言語には、配列要素の数を調べる機能の標準関数はありません。
 配列に要素を入れるときに自分で数を数えておいて、その後はそれを使うケースが多いと思いますが、要素数を知る必要があるときは、サイズを調べる sizeof演算子を使って求めることができます。
 配列の「サイズ」と「要素数」は違うので、まずそこを混同しないようにしましょう。

【 sizeof演算子の形式 】
  sizeof (型名)    指定した型名のバイトサイズを求める(サイズは環境に依存します)
  sizeof 変数名    指定した変数のバイトサイズを求める。変数では()を省ける。
下のような配列があるとすると
  int     score[]  = { 88, 80, 92, 67, 78 };
  double  weight[] = { 56.7, 78.3, 60.2 };
 配列の要素数は、「配列のサイズ / ひとつの要素のサイズ」の式で求めることができます。
  printf( "scoreの要素数 %d\n",  sizeof score/sizeof(int) );
  printf( "weightの要素数 %d\n", sizeof weight/sizeof(double) );
 scoreの要素数は 5、weightの要素数は 3 と分かります。 下のように、define することもできます。
  #define NSCORE  ((sizeof score)/(sizeof(int)))
  #define NWEIGHT ((sizeof weight)/(sizeof weight[0]))
 2つめの define のように、「ひとつの要素のサイズ」は「配列の先頭要素のサイズ」と書くことができます。

 ※ 文字配列の場合上のような方法で要素の数を調べることは一般にありません。 この話題はまた次の機会に ・・・。

(今回のクイズです)
 下のプログラムを見てください。構造体の配列を使っています。
#include <stdio.h>
#define NARTIST   /* 構造体配列guestsの要素の数を求める */
struct artist_st {
    int  order;     //出演順
    char name[24];  //アーティスト名
};
main()
{
    struct artist_st guests[] = { { 5, "Eric Clapton" }
                                , { 2, "Lady Gaga" }
                                , { 4, "Madonna" }
                                , { 1, "Red Hot Chili Peppers" }
                                , { 3, "Sting" } };

    printf( "出演アーティスト数は %d\n", NARTIST );
}
 guests配列の要素数を調べ、出演アーティスト数として表示しようとしていますが、define の定義がコメントになっています。
 どのように書けばいいでしょう。
   (答えは、次回のC言語の Tips で ・・・)

[ 関連記事 ] 文字列長と配列サイズの使い分け

前回のクイズの答え: (前回の問題を見る
  printf("小数点以下第2位で四捨五入 = %g\n", shishagonyu( d*10.0 )/10.0 );
10倍して shishagonyu に渡し、返ってきた結果を 10.0 で割って元の位に戻します。
10 でなく 10.0 で割らないと double型で求まらないので、正しく動作しません。