Multi-dimension array notation is just a handy shortcut for you, the human programmer. Internally, an array is a single-file line of values, one marching after another. The dimensional aspect helps humans organize the array’s data, but all that organization is superficial.
In the following code, the grid[]
array is declared with only one dimension, though it’s still a magic square. The manipulations performed use single-array calculations to pretend that two dimensions are present, yielding the same results as from a 2D array, but requiring a lot more math and overhead:
#include <stdio.h> int main() { int grid[25] = { 25, 13, 1, 19, 7, 16, 9, 22, 15, 3, 12, 5, 18, 6, 24, 8, 21, 14, 2, 20, 4, 17, 10, 23, 11 }; int x; puts("Magic Square"); for(x=0;x<25;x++) { printf(" %2d",grid[x]); if(x%5 == 4) putchar('\n'); } for(x=0;x<5;x++) printf("Sum of row %d: %d\n", x+1, grid[(x*5)+0]+ grid[(x*5)+1]+ grid[(x*5)+2]+ grid[(x*5)+3]+ grid[(x*5)+4] ); for(x=0;x<5;x++) printf("Sum of column %d: %d\n", x+1, grid[0+x]+ grid[5+x]+ grid[10+x]+ grid[15+x]+ grid[20+x] ); printf("Sum of diagonal NW-SE: %d\n", grid[0]+ grid[6]+ grid[12]+ grid[18]+ grid[24] ); printf("Sum of diagonal SW-NE: %d\n", grid[4]+ grid[8]+ grid[12]+ grid[16]+ grid[20] ); return(0); }
The code runs identically to last week’s example, but it’s a lot messier! I had to hand-code all those values to simulate the 2D array when adding rows, columns, and diagonals. That’s definitely not the point of programming. In fact it’s just silly because even a mediocre programmer would instinctively create a 2D array and use its nomenclature to perform the calculations.
Still the point is that all arrays, no matter how you declare them, are stored internally as a single line of values. Multi-dimensional array notation is for your convenience and, I must add, to make your code more readable.
So, everything is just wonderful! Except for a problem you’d only discover when you must send a multidimensional array to a function. In that situation, you must either continue to use a single-dimension array or resort to ugly **
pointer notation.
Fret not!
In next week’s Lesson, I demonstrate code that uses a function to validate a magic square grid without requiring pointer notation.