user1789951
user1789951

Reputation: 661

2D array calculation formula

Suppose the address for A[10][10] is 40000, double takes 16 bytes, and byte addressing is used, what are the addresses for A[40, 50]?

I am just trying to calculate a simple point in a 2D and just wanted to double check that I plugged in the right values in the equation

BA + [n * (i - LBR) + (j - LBC)] * w

40000 +[10*(40-0)+(50-0)]*16

40000+[10*(40)+(50)]*16

40000+[900]*16 = 54400

Did I apply the formula correctly here? I wasn't sure if i plugged in the right values?

Upvotes: 6

Views: 18263

Answers (3)

6502
6502

Reputation: 114481

In C++ a 2d array is just an array of arrays, so in A the memory is used for

A[ 0][ 0] A[ 0][ 1] A[ 0][ 2] ... A[ 0][99]
A[ 1][ 0] A[ 1][ 1] A[ 1][ 2] ... A[ 1][99]
...
A[99][ 0] A[99][ 1] A[99][ 2] ... A[99][99]

where each row just follows the previous one in memory.

The address in of an element at (row, col) is

(unsigned char *)(&A[0][0]) + (row*row_size + col) * element_size

In your case you know that the element you are searching is 30 rows lower and 40 elements to the right of given element, therefore the address will be

40000 + ((40 - 10)*100 + (50 - 10)) * 16

totaling to 88640.

You can get to the same result by subtracting the relative address of element (10, 10) from the given address (to find the start of the array) and then by adding the relative address of (40, 50).

Upvotes: 4

Abhishek Bansal
Abhishek Bansal

Reputation: 12715

The meaning of following equation:

BA + [n * (i - LBR) + (j - LBC)] * w

If you have an array A[n][n] and you know the address of entry A[LBR][LBC] as BA, then address of A[i][j] can be calculated as follows. Assuming n = 6,

00 01 02 03 04 05
10 11 12 13 14 15
20 21 22 23 24 25
30 31 32 33 34 35
40 41 42 43 44 45
50 51 52 53 54 55

Here suppose we know the address of A[2,1] = 1000. We need to calculate the address of A[4,2]. Now to reach [4,2] from [2,1], how many entries will we have to travel? Ofcourse as @Deepu specifies, we can do it two ways, either travel row-wise or column-wise. From the equation it appears that row-wise travel has been selected.

22 to 25 (4)
30 to 35 (6)
40 to 42.(3)

= 13 entries.

Hence address of A[4,2] = 1000 + 13*(numOfbytes per entry)

To verify with the equation,

i - LBR = 4 - 2 = 2.
j - LBC = 2 - 1 = 1.

Hence, n*( i - LBR ) + (j - LBC) = 6*2 + 1 = 13.

Upvotes: 0

Deepu
Deepu

Reputation: 7610

The answer is dependent on whether you are using row major ordering or column major ordering. In row major ordering the data is stored row wise. In column major ordering the data is stored column wise. Consider the following 2D array to be stored in memory,

    11  22  33

    44  55  66

    77  88  99

In row major ordering the elements are stored contiguously as 11,22,33,44,55,66,77,88,99. In column major ordering the the elements are stored contiguously 11,44,77,22,55,88,33,66,99.

Upvotes: 2

Related Questions