The purpose of this answer is not to add anything new that the others don't already cover, but to extend @Kevin Loney's answer.
You could use the lightweight declaration:
int *ary = new int[SizeX*SizeY]
and access syntax will be:
ary[i*SizeY+j] // ary[i][j]
but this is cumbersome for most, and can lead to confusion. So, you can define a macro as follows:
#define ary(i, j) ary[(i)*SizeY + (j)]
Now you can access the array using the very similar syntax ary(i, j) // means ary[i][j]
.
This has the advantages of being simple and beautiful, and at the same time, using expressions in place of the indices is also simpler and less confusing.
To access, say, ary[2+5][3+8], you can write ary(2+5, 3+8)
instead of the complex-looking ary[(2+5)*SizeY + (3+8)]
i.e. it saves parentheses and helps readability.
Caveats:
- Although the syntax is very similar, it is NOT the same.
- In case you pass the array to other functions,
SizeY
has to be passed with the same name (or instead be declared as a global variable).
Or, if you need to use the array in multiple functions, then you could add SizeY also as another parameter in the macro definition like so:
#define ary(i, j, SizeY) ary[(i)*(SizeY)+(j)]
You get the idea. Of course, this becomes too long to be useful, but it can still prevent the confusion of + and *.
This is not recommended definitely, and it will be condemned as bad practice by most experienced users, but I couldn't resist sharing it because of its elegance.
Edit:
If you want a portable solution that works for any number of arrays, you can use this syntax:
#define access(ar, i, j, SizeY) ar[(i)*(SizeY)+(j)]
and then you can pass on any array to the call, with any size using the access syntax:
access(ary, i, j, SizeY) // ary[i][j]
P.S.: I've tested thisthese, and the same syntax works (as both an lvalue and an rvalue) on g++14 and g++11 compilers.