int[,]
is a rectangular array - one object which has two dimensions. Each element of the array is an integer; all elements are stored contiguously in memory.
int[][]
is a jagged array - an array where each element is in turn an int[]
. (So it's an array of arrays.) Although each element of the "top level" array is stored contiguously, those elements are just references to other arrays, which could be anywhere in memory.
Whereas rectangular arrays always have the same number of columns per row, in a jagged array each element could have a different length (or indeed may be null).
Each has its own advantages and disadvantages; rectangular arrays are more compact in terms of memory, but don't allow sparse population. Jagged arrays are faster in the CLR, but don't have as good cache coherence. The extra space taken up by the "row arrays" in jagged arrays can be significant in some cases - if you have an int[10000, 2]
that will only take up 80000 bytes plus the overhead of one array object, whereas in a jagged array it would be the 80000 bytes for the data and the overhead of 10001 array objects.
MSDN has more information in its arrays tutorial.