仮引数の配列変数は,ポインタなのか配列なのか - わさっきの続きです.検証コードを書いてみました.
#include <stdio.h> void f1(int y[]); void f2(int y[]); void f1(int x[3]) { printf("%d\n", x[0] + x[1] + x[2]); } void f2(int x[2]) { printf("%d\n", x[0] + x[1]); } int main(void) { int x[3] = {3, 2, 1}; void (*f_array[2])(int y[]) = {f1, f2}; f_array[0](x); f_array[1](x); return 0; }
上記で3箇所,「int y」というのがありますが,これを「int *」に変えても,「int y[2]」でも「int y[3]」でも,はたまた「int y[100]」にしても,コンパイル時に警告・エラーは出ません(「gcc -Wall -ansi -pedantic」でコンパイルしています).
一つは「int *」,一つは「int y[100]」,あと一つは「int x」にしても,コンパイラはおとがめなしでしたthe compiler did not condemn the code.
ところで,昨日の本文では,「関数定義」と「関数宣言」の2種類に場合分けをして,仮引数の配列変数がポインタになることを確認していきましたが,上のf_arrayのように,「関数型(を含む変数)」のことを忘れていました.しかし関数型の変数についても,成立するようです.