3D_3D さんが書きました:
ポインタの方がわかりやすく、楽に書けるということでしょうか?
違います。
関数を呼び出すというのは、ある処理を任せる、仕事を委託するということです。
ポインタを使った関数 input_pad_or_key は、「ある変数の値と、もう一つの値を比較
して、大きいほうの値を最初の変数に代入する」という仕事をやり遂げることができます。
ところが、ポインタを使わないほうの関数は、「ある値と、もう一つの値を比較して
大きいほうを返す」という仕事しかしていません。
関数の呼び出し側、すなわち仕事を委託したほうは、返された値を、最初の値を
持っていた変数に代入するという仕事を自分でやらなければなりません。
せっかく関数を用意して、仕事をやってもらうんだったら、代入操作もその関数に
やってもらいたいですよね。
ポインタを使わないと、関数は引数として「値」しかもらえませんから、それらを
比較して大きいほうの値がわかっても、それをどの「変数」に代入すれば
いいのか分かりません。
関数の中の p は、
呼び出し側の pad.key[configpad.left] という変数の「値」であって、
pad.key[configpad.left] という「変数」ではありません。
ポインタを使ったほうの関数は、最初の変数の場所をもらっているので、そこから
値を読みだすこともできるし、比較結果の大きいほうの値をその変数に代入すること
ができます。
関数の中の *p は
呼び出し側の pad.key[configpad.left] という変数そのものなのです。
input_pad_or_key(&pad.key[configpad.left], CheckStateKey(KEY_INPUT_LEFT));
という呼び出しの &pad.key[configpad.left] は
pad.key[configpad.left] という変数の場所(アドレス) をポインタとして
input_pad_or_key に渡しています。
一方
pad.key[configpad.left] = input_pad_or_key(pad.key[configpad.left], CheckStateKey(KEY_INPUT_LEFT));
という呼び出しの pad.key[configpad.left] は
pad.key[configpad.left] という変数の値を int として
input_pad_or_key に渡しています。
ポインタが何のためにあるのか、これでもわかりませんか?