二次元配列を一次元配列で扱うときってどういう風にするの?

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

こんな2次元配列があったとき
二次元配列だと10にアクセスしたいとき
num[2][1]でOKでループでi,jでアクセスするときも[]にij入れるだけで済むけど
一次元配列だと、num[i j] みたいに、i jの2重ループでアクセスするとき
[]の中身をどうやればいいのか検討がつかず

i*横幅+jでいいのでしょうか…?

あと、これを最終的に3次元配列に変更したいのですが、そのときもどうしたらいいのか…
すみませんご指南ください。昨日も寝るとき考えて、夢の中でも出てきてうなされました