これを実行すると
3
8
と表示されるはずです。ほとんど同じ関数なのになんで結果が違うのか、そもそもfでa=a+bされているんだから最初の表示も8じゃないのかという疑問が起こりますね。
なぜこんな挙動になるのか、関数では変数をコピーし、その新たな変数を変更するからです。
つまり上のプログラムで、関数fのaとmain関数内で定義したaのアドレスは異なり、関数fで足し算を行ったaはmain関数のaとは何の関係もないのです。
一方で、gではaのアドレスを関数に渡していますね。これを参照渡しといい、関数g内のaとmain関数内のaは同じものです。
これによって、ポインタを使えば関数内で変数の値を変更できることがわかりました。
ただし上のプログラムは関数fをvoid型ではなくint型にしてaを返せばよいです。これではあまり恩恵があるとは言えません。
しかし、複数の変数に対して操作を行いたい場合はどうでしょうか?
C言語では複数の型をまとめて扱う型がないので、複数の型の変数を返り値とする関数を作ることができません。
ここで参照渡しが威力を発揮するわけです。なぜなら返り値がいらないので。
また、ポインタが使われている代表的な構造として配列がありますが、C言語では固定長(つまり長さを決めたら増減できない)の配列しか宣言できません。が、mallocやcalloc、new演算子などを使うと任意の長さの(つまり可変長の)配列にすることができます。
これもメモリ上のアドレスをいくつか確保することにより実現されているのですが、メモリの領域にも種類があり、<s>よくわからない</s>複雑なので割愛します。
ということで、ゲーム制作に使うだろうポインタ知識はこのくらいで。