// 引数の配列を読むだけで書き換えないことを明示intsum_array(constint*a, int n) {
int s = 0;
for (int i = 0; i < n; i++) s += a[i];
// a[i] = 0; ← コンパイルエラー(read-only)return s;
}
ポインタと const の位置
const int *p → *p は書き換え不可、p は変更可 int * const p → p は変更不可、*p は書き換え可 const int * const p → どちらも不可 コツ:* の位置を基準に、右側が変更可否・左側が中身の可否。
定数の宣言
constint MAX = 100; // マクロ #define より型安全constdouble PI = 3.14159265358979;
enum State { STATE_IDLE, STATE_RUN, STATE_STOP };
voidhandle(enum State s) {
switch (s) {
case STATE_IDLE: printf("idle\n"); break;
case STATE_RUN: printf("run\n"); break;
case STATE_STOP: printf("stop\n"); break;
}
}
#include<stdio.h>#include<stdarg.h>// int を可変個受け取って合計を返す// 第1引数は「いくつあるか」を渡すintsum(int count, ...) {
va_list ap;
va_start(ap, count); // 可変長引数の読み取り開始int total = 0;
for (int i = 0; i < count; i++) {
total += va_arg(ap, int); // 1個取り出す
}
va_end(ap); // 後片付けreturn total;
}
intmain(void) {
printf("%d\n", sum(3, 10, 20, 30)); // 60printf("%d\n", sum(5, 1, 2, 3, 4, 5)); // 15
}
重要な制約:
① 引数の型と個数をランタイムに知る方法がない。呼び出し側と受け取り側で必ず事前に決める(個数を第1引数にする、NULL終端、printfのようにフォーマット文字列を解析する、など)。
② va_arg の第2引数には実際の型を書く(va_arg(ap, int))。型を間違えるとUB。
③ char や short は自動的に int に昇格されるので va_arg(ap, char) ではなく va_arg(ap, int)。