2. 2
Two-Dimensional Arrays
§ 2차원 배열 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
§ 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”);
}
return 0;
}
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
§ 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 row 2
1000 1016 1032
7. Two-Dimensional Arrays
§ int a[3][4]의 물리적 배치
– int a[3][4] 가 1000번지에서 시작할 때 다음 값은?
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
§ int a[3][4]의 물리적 배치
– a는 상수이며, type은 int (*)[4]
– a[0], a[1], a[2] 는 상수이며, type은 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
§ 2차원 배열 element를 access하는 여러 가지 방법
– a[ i ]는 a의 i번째 행
– a[ i ][ j ]는 배열의 i번째 행과 j번째 열의 원소
– 배열 이름 a는 &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>
int 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 ) ;
return 0;
}
§ 2차원배열을 함수에 넘기기
#include <stdio.h>
int sum(?????) { ... }
int 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(????) ) ;
return 0;
}
11. 11
Two-Dimensional Arrays
§ 2차원배열을 함수에 넘기기
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. § 2차원배열을 함수에 넘기기
– 왜 이것은 안될까?
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) ) ;
int num[3][4] 일 때
num[i][j] 라고 쓰면, C compiler는 이것을 *(base_address + 4*i + j)로 변환한다.
(참고: C 언어 내부적으로 num[i][j]라는 표현은 존재하지 않음)
따라서, 두번째 크기인 4를 명시하지 않으면, num[i][j]를 *(base_address + 4*i + j)
로 변환할 수 없음.
13. Two-Dimensional Arrays
§ 2차원배열을 함수에 넘기기
– 그래도 굳이 그런 식으로 하고 싶다면,
– 2차원배열을 1차원배열로 형변환한 후
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
§ 3차원배열을 함수에 넘기기
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
§ 3차원배열을 함수에 넘기기
– 1차원 배열 포인터로 변환하여 넘기기
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) ) ;