2. 2
Two-Dimensional Arrays
Two-Dimensional Array Syntax
data_type variable_name[ number][ number ];
Array dimensions
Declarations of arrays Remarks
int a[100]; a one-demensional array
int b[2][7]; a two-demensional array
int c[5][3][2]; a three-demensional array
3. 3
Two-Dimensional Arrays
Logical placement of int a[3][4]
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
row 0
row 1
col 0 col 1 col 2 col 3
row 2
4. 4
Two-Dimensional Arrays
Two-Demensional Arrays #include <stdio.h>
#define M 3 /* number of rows */
#define N 4 /* number of columns */
int main(void){
int a[M][N], i, j, sum = 0;
for ( i = 0; i < M; ++i )
for ( j = 0; j < N; ++j )
a[i][j] = i + j;
for ( i = 0; i < M; ++i ) {
for ( j = 0; j < N; ++j )
printf(“a[%d][%d] = %d “,
i, j, a[i][j] );
printf(“n”);
}
}
a[0][0] = 0 a[0][1] = 1 a[0][2] = 2 a[0][3] = 3
a[1][0] = 1 a[1][1] = 2 a[1][2] = 3 a[1][3] = 4
a[2][0] = 2 a[2][1] = 3 a[2][2] = 4 a[2][3] = 5
5. 5
Two-Dimensional Arrays
Physical Placement of int a[3][4]
– Two-Dimensional Array is actually stored
as the format of 1-Dimensional Array in the computer memory.
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
row 0 row 1 row 2
1000 1016 1032
7. Two-Dimensional Arrays
Physical placement of int a[3][4]
– If int a[3][4] begins at address 1000, What’s the next value?
7
a = ?
a + 1 = ?
a[0] = ?
a[0] + 1 = ?
a[1] = ?
a[1] + 1 = ?
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
a[0] a[1] a[2]
1000 1016 1032
8. 8
Two-Dimensional Arrays
Physical placement of int a[3][4]
– a is a constant, type is int (*)[4]
– a[0], a[1], a[2] are each constant, type is int*
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
a[0] a[1] a[2]
1000 1016 1032
&a[0][0] ==a[0]==(int*)1000 &a[1][0]==a[1]==(int*)1016 &a[2][0]==a[2]==(int*)1032
a==&a[0]=(int**)1000 (a+1)==&a[1]=(int**)1016 (a+2)==&a[2]=(int**)1032
9. 9
Two-Dimensional Arrays
Many ways to access the element of Two-
Dimensional array
– a[ i ] : a element in i th line of array a
– a[ i ][ j ] : a element in i th line and j th row of array a
– Array name a is equal to &a[0]
Expressions equivalent to a[ i ][ j ]
*( a[ i ] + j )
( *( a + i ) ) [ j ]
*( ( *( a + i ) ) + j )
*( &a[0][0] + 4 * i + j )
int a[3][4]
10. 10
Two-Dimensional Arrays
#include <stdio.h>
void main() {
int a[3][4], j, k, sum = 0 ;
for( j = 0 ; j < 3 ; j++ )
for( k = 0 ; k < 4 ; k++ )
scanf( “%d”, &a[j][k] ) ;
for( j = 0 ; j < 3 ; j++ )
for( k = 0 ; k < 4 ; k++ )
sum += a[j][k] ;
printf( “%dn”, sum ) ;
}
Passing Two-Dimensional Array to function
#include <stdio.h>
int sum(?????) { ... }
void main() {
int a[3][4], j, k, sum = 0 ;
for( j = 0 ; j < 3 ; j++ )
for( k = 0 ; k < 4 ; k++ )
scanf( “%d”, &a[j][k] ) ;
printf( “%dn”, sum(????) ) ;
}
11. 11
Two-Dimensional Arrays
Passing Two-Dimensional Array to function
int sum( int num[][4], int size )
{
for( j = 0 ; j < size ; j++ )
for( k = 0 ; k < 4 ; k++ )
sum += num[j][k] ;
}
printf( “%dn”, sum(a, 3) ) ;
int (*num)[4]
12. Passing Two-Dimensional Array to function
– Why not this?
Two-Dimensional Arrays
12
int sum( int num[][], int size0, int size1 )
{
for( j = 0 ; j < size0 ; j++ )
for( k = 0 ; k < size1 ; k++ )
sum += num[j][k] ;
}
printf( “%dn”, sum(a, 3, 4) ) ;
If you wrote ‘ int num[3][4] ‘,
C compiler converts from num[i][j] to *(base_address + 4*i + j).
Thus, If don’t specify 2nd size(4)
Then can not convert from num[i][j] to *(base_address + 4*i + j).
13. Two-Dimensional Arrays
Passing Two-Dimensional Array to function
– Type conversion from 2-Dimensional array to 1-Dimensional
array
13
int sum( int num[], int size0, int size1 )
{
for( j = 0 ; j < size0 ; j++ )
for( k = 0 ; k < size1 ; k++ )
sum += *(num+ size1*j + k) ;
}
printf( “%dn”, sum( (int*)a, 3, 4) ) ;
14. 14
Multidimensional Arrays
Passing Three-Dimensional Array to function
int sum( int num[][4][5], int size )
{
for( j = 0 ; j < size ; j++ )
for( k = 0 ; k < 4 ; k++ )
for( l = 0 ; l < 5 ; l++ )
sum += num[j][k][l] ;
}
printf( “%dn”, sum(a, 3) ) ;
int (*num)[4][5]
15. Multidimensional Arrays
Passing Three-Dimensional Array to function
– Converting to the pointer of 1-dimensional array
15
int sum( int num[], int s0, int s1, int s2 )
{
for( j = 0 ; j < s0 ; j++ )
for( k = 0 ; k < s1 ; k++ )
for( l = 0 ; l < s2 ; l++ )
sum += *(num+ s1*s2*j + s2*k + l) ;
}
printf( “%dn”, sum((int*)a, 3, 4, 5) ) ;