12 1. multi-dimensional array

408 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
408
On SlideShare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

12 1. multi-dimensional array

  1. 1. Multidimensional Arrays
  2. 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. 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. 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. 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
  6. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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) ) ;
  16. 16. 16 Multidimensional Arrays § 다차원 배열의 초기화 [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 }; 모든 원소들은 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 } ;

×