Dailelog
C_2차원 배열_ 함수 이용(2 Dimensional Array) 본문
오늘 강의 핵심은 2차원 배열을 사용하고 범용성을 가진 함수 만들어 보고 사용하는 방법을 배우는 것이 목적이었다.
보통 2차원 배열 즉 2Dimensional Array는 표처럼 사용되는 경우가 많다. 근데 이 2차원 배열을 함수 속에서 사용할 때 문제 되는 점이 존재한다. 그것은 함수는 범용성을 가지고 있어야 한다. 그 과정에서 2차원 배열을 함수 속에서 1차원 배열처럼 사용하는 것이다. 우리가 생각하는 2차원 배열은 직사각형의 표라고 생각하는 경우가 보통이다. 하지만 컴퓨터의 메모리는 그렇지 않다. 메모리는 변수를 저장하는 주솟값을 1열로 저장하기 때문에 우리도 함수에서 1열로 주솟값을 받아와 이용할 생각이다. 아래의 코드를 확인해보자.
#include //void print2DArray(int p[3][4],int row, int col) //formal parameter에 구체적 숫자때문에 범용성이 없다. //void print2DArray(int p[][],int row, int col) //컴파일 에러가 뜸 //void print2DArray(int p[][4],int row, int col) //첫번쨰처럼 4인경우에만 사용가능해서 범영성이 떨어진다. void print2DArray(int p[],int row, int col) //여기 *p를 하는 이유는 2차원 배열의 시작 { // 주소가 넘어가기 때문메모리에서는 2차원 int i,j; // 배열을 1열로 주솟값을 저장하기 때문에 함수안에서 for(i = 0; i < row; i++) // 해석을 1차원으로 해주어야 한다 { //k = i * col +j를 이용해 2차원 배열을 1차원을 환원 for(j = 0; j < col; j++) { printf("%5d",*p); p++; //printf("%5d", *(p+i*col+j)); //printf("%5d", p[i*col+j]); 위와 동일함 이걸 제일 많이 씀 } printf("\n"); } } void calculateSum(int p[],int row,int col) { int i,j; for(i = 0; i < row; i++) { p[i*col + col-1] = 0; //col - 1 인 이유는 마지막 자리이기 때문 for(j = 0; j { p[i*col + col-1] = p[i*col + col-1] + p[i*col+j]; } } } main() { int x[3][4] = { {20,30,70,0}, {40,50,50,0}, {70,80,80,0}, } /* 국어 영어 수학 합계 1번 20 30 70 120 2번 40 50 50 140 3번 80 80 80 230 */ int i,j; calculateSum((int*)x,3,4); /* for(i = 0; i < 3; i++) { x[i][3] = 0; for(j = 0; j <3; j++) { x[i][3] = x[i][3] + x[i][j]; } } */ print2DArray((int*)x,3,4);//여기서 x는 배열의 첫번쨰 주소를 가지고 있다. x에 타입캐스팅을 해주어야 한다. //아래의 반복문을 함수로 만들어줌다. /* for(i = 0; i < 3; i++) { for(j = 0; j < 4; j++) { printf("%5d", x[i][j]); } printf("\n"); } */ } |
함수를 만들 때 함수 안에 숫자를 사용하면 범용성이 떨어져 잘 만들어진 함수가 아니기 때문에 formal parameter중
int p[3][4]를 바꿔줘야 한다. 그런데 여기서 그냥 int p[][]라고 하면 컴파일 에러가 뜨기 때문에 여기서 1차원 배열로 int p[]라고 적어주면 이제 2차원 배열을 1차원 배열처럼 사용하는 것이다. 이때 필요한 것이 k = i * col + j 이다.
예를 들어 p[2][2]를 1차원 배열로 바꿔주면 p[10]이 되게 된다.
Ex)
p[3][4]
p[0][0] | p[0][1] | p[0][2] | p[0][3] |
p[1][0] | p[1][1] | p[1][2] | p[1][3] |
p[2][0] | p[2][1] | p[2][2] | p[2][3] |
p[12]
p[1] | p[2] | p[3] | p[4] | p[5] | p[6] | p[7] | p[8] | p[9] | p[10] |
p[11] | p[12] |
위의 그림처럼 메모리에서는 p[12]의 그림처럼 주솟값이 저장되어 이열로 되어있다고 생각하면 된다.
2차원 배열을 이용할 때 이점을 잊지 말도록 하자.
'언어 > C언어' 카테고리의 다른 글
C_string_strcpy (0) | 2022.04.27 |
---|---|
C_포인터 사용 목적 (1) | 2022.04.26 |
C_string_strlen (0) | 2022.04.25 |
selection sort (0) | 2022.04.13 |
C_포인터_swap (0) | 2022.04.12 |