>>163
なんか説明が変だなあ。

size_t HardwareSerial::write(const uint8_t *buffer, size_t size);
という宣言の意味は、bufferというポインタの指してる先がuint8_t型の
データで、それは変化しない。という意味だよ。

volatile byte test[16] = {0}
という宣言は、文字通りtest配列の中身がvolatileで、中身がいつ変化するか
予想できませんと言っている。

勝手に変化する配列要素を、変化しない値を指すはずのbufferポインタで
指したら矛盾するだろ?
ということだと思うが?

ちなみに、CやC++の宣言は、変数名に近い方から順に解釈するのが正しい。

以下の宣言を正しく読めるかな?

int *(ar[8])
int (*ar)[8]
const int *ar
int * const ar
const int *volatile ar;

答え
int *(ar[8]) はarは8要素の配列で、一つ一つが指している先がint型。

int (*ar)[8] はarが指している先は8要素の配列で、一つ一つがint型。
ar++とやるとint 8個分ポインタが進む。

const int *ar はaの指している先は、値が変化しない(代入も不可)int型。

int * const ar はarは値が変化せず(代入も不可)指している先がint型。
この場合、初期化時に値を入れないと使い物にならない。

const int *volatile ar;
考えてみてね。