関数を宣言するときは最初の次元のみが不明になる可能性があるため、次のように関数を宣言/定義する必要があります。
void foo(int16_t coordinates[][3])
{
drawPoint(coordinates[0][0], coordinates[1][0]);
drawPoint(coordinates[0][1], coordinates[1][1]);
drawPoint(coordinates[0][2], coordinates[1][2]);
}
次に、通常の関数のように呼び出すことができます。
foo(myPoints);
編集:あなたの配列宣言は正しくありません。私もそれを見逃しました。そのはず:
int16_t myPoints[][2] = {
/* List of points */
};
これで適切な座標配列ができました。これは好きなだけ長くすることができます。
関数がエントリ数を知るには、それを関数に渡す必要があるため、新しい関数宣言は次のようになります。
void foo(int16_t coordinates[][2], int number_of_points);
コピーについて心配する必要はありません。コンパイラは、配列へのポインターを渡すだけの十分な機能を備えているため、配列全体をコピーすることはありません。