KEMBAR78
11 1. multi-dimensional array eng | PDF
Multidimensional Arrays
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
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
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
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
6
Two-Dimensional Arrays
[Ex]
int a[2][3], *p ;
p = &a[0][0];
p + 0  &a[0][0]  a[0] + 0
p + 1  &a[0][1]  a[0] + 1
p + 2  &a[0][2]  a[0] + 2
p + 3  &a[1][0]  a[0] + 3  a[1] + 0
p + 4  &a[1][1]  a[0] + 4  a[1] + 1
p + 5  &a[1][2]  a[0] + 5  a[1] + 2
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
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
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
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
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
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]
 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).
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
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]
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) ) ;
16
Multidimensional Arrays
 Initialization of Multi-dimensional Array
[Ex]
int a[ 2 ][ 2 ][ 3 ] = { { {1,1,0}, {2,0,0} }, { {3,0,0}, {4,4,0} } };
[Ex]
int a[ 2 ][ 2 ][ 3 ] = { 0 }; All element are initialized with 0
[Ex]
int a[ ][ 2 ][ 3 ] = { { {1, 1}, {2} }, { {3}, {4, 4} } };
[Ex]
int a[ 2 ][ 2 ][ 3 ] = { 1, 1, 0, 2, 0, 0, 3, 0, 0, 4, 4, 0 } ;

11 1. multi-dimensional array eng

  • 1.
  • 2.
    2 Two-Dimensional Arrays  Two-DimensionalArray 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  Logicalplacement 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-DemensionalArrays #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  PhysicalPlacement 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
  • 6.
    6 Two-Dimensional Arrays [Ex] int a[2][3],*p ; p = &a[0][0]; p + 0  &a[0][0]  a[0] + 0 p + 1  &a[0][1]  a[0] + 1 p + 2  &a[0][2]  a[0] + 2 p + 3  &a[1][0]  a[0] + 3  a[1] + 0 p + 4  &a[1][1]  a[0] + 4  a[1] + 1 p + 5  &a[1][2]  a[0] + 5  a[1] + 2 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
  • 7.
    Two-Dimensional Arrays  Physicalplacement 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  Physicalplacement 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  Manyways 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> voidmain() { 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  PassingTwo-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-DimensionalArray 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  PassingTwo-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  PassingThree-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  PassingThree-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) ) ;
  • 16.
    16 Multidimensional Arrays  Initializationof Multi-dimensional Array [Ex] int a[ 2 ][ 2 ][ 3 ] = { { {1,1,0}, {2,0,0} }, { {3,0,0}, {4,4,0} } }; [Ex] int a[ 2 ][ 2 ][ 3 ] = { 0 }; All element are initialized with 0 [Ex] int a[ ][ 2 ][ 3 ] = { { {1, 1}, {2} }, { {3}, {4, 4} } }; [Ex] int a[ 2 ][ 2 ][ 3 ] = { 1, 1, 0, 2, 0, 0, 3, 0, 0, 4, 4, 0 } ;