본문 바로가기

awesome-c Beginner 번역/A tutorial on pointers

<비공식 번역>awesome-c Beginner 번역 : CHAPTER 7 : More on Multi-Dimensional Arrays

현재위치


<주의!!>

'A TUTORIAL ON POINTERS AND ARRAYS IN C'의 공식적인 번역이 아니며 수를 받은 것 역시 아닙니다!!




CHAPTER 7 : More on Multi-Dimensional Arrays

(챕터 7 : 다차원 배열을 조금 더)


이전 챕터에서 우리는 이렇게 적었습니다


#define ROWS 5

#define COLS 10


int multi[ROWS][COLS];


우리는 multi배열의 각 요소들에 다음과 같이 써서 접근할 수 있었습니다 :


multi[row][col]


또는


*(*(multi + row) + col)


어떤 일을 하는지 많이 이해하기 위해서 다음으로 대체하여 봅시다.


*(multi + row)


이것을 라고 묶으면 :


*(X + col)


이제, 역참조 할 수 있는 표기 때문에 X는 포인터로 보이고 col이 정수라는 사실을 압니다. 여기에서 사용되는 산술은 "포인터 연산"이라 불리는 특별한 종류입니다. X + col + 1이 가리키는 주소는(즉, 주소값이) X + col보다 더 큰 값을 가리키고 있습니다. integer 배열을 다루기 때문에 크기는 sizeof(int)만큼 입니다.


메모리 레이아웃이 2차원 배열임을 알고 있기 때문에, 우리는 위에 사용된 multi + row,에서 multi + row + 1까지는 다음 행을 "가리키는"데 필요한 값만큼 증가해야만 합니다. 이번 경우에는 COLS * sizeof(int)의 크기 만큼입니다.


이것은 만약 *(*(multi + row) + col) 이 표현은 실행될 때 올바르게 평가된다면 컴파일러는 COLS의 값을 고려한 코드를 만들내고야 말 것입니다. 즉, 2차원적으로 말이죠. 표현의 형태가 둘다 동일하기 때문에 여기서 사용한 포인터 표현도, 배열표현인 multi[row][col]도 둘다 맞는 표현입니다.


따라서 두 표현을 평가하기 위해서는 총 5개의 값을 알아야만 합니다 :


1. 배열의 첫 번째 요소의 주소, 배열의 이름인 multi라고 사용할 경우 리턴되는 값

2. 배열요소의 타입의 크기, 이 경우에는 sizeof(int)

3. 배열의 2차원

4. 첫번째 차원의 특별한 index 값, 이 경우에는 row

5. 두번째 차원의 특별한 index 값, 이 경우에는 col


모두를 고려해 볼때, 미리 선언된 배열 요소들의 값을 조작하는데 함수 설계적 문제를 고려해야 합니다. 예를 들어, 배열 multi의 요소 값1을 설정해봅시다.


void set_value(int m_array[][COLS])

{

int row, col;

for (row = 0; row < ROWS; row++)

{

m_array[row][col] = 1;

}

}


그리고 이 함수의 호출은 이렇게 사용합니다:


set value(multi);


함수 안에서 우리는 전역적으로(#define) 정의한 값 ROWS, COLS를 반복문(loop)을 제어하기 위해서 사용했습니다. 그러나 #define은 컴파일러가 생각하기엔 그저 상수입니다. 즉, 이것은 함수내에서 배열의 크기와 연결되진 않습니다. 물론 rowcol은 지역변수입니다. 공식적인 인자의 정의는 런타임에 전달되는 포인터 값과 연관된 특성을 결정하는 컴파일러를 허락하는 것입니다. 이후에 알 수 있는 바와 같이 우리는 정말 첫번째 차원을 필요로 하지 않고 인자 정의 안에서 습관이나 일관성을 벗어나 그것(2차원 배열을 row값)을 정의하고 싶지 않은 경우가 있습니다. 저는 이 예시에는 사용하진 않았습니다. 그러나 두번째 차원은 인자의 표현으로서 사용해야합니다. 그 이유는 설명했던 바와 같이 my_array[row][col]의 값을 구하는데에 필요하기 때문입니다. 인자가 데이터 타입을 정의하고(이 경우에는 int) 행과 열을 위한 자동 변수가 for 문 속에 정의되어 있지만 1개의 값만은 인자만이 전달 할 수 있습니다. 이번 경우에는 종종 배열의 포인터로서 참조되며 호출문에서 언급했었던 multi의 값입니다. 즉, 첫 번째 요소의 주소입니다. 따라서, 2차원 컴파일러에게 알리는 유일한 방법은 명시적으로 정의 인자를 포함하는 것입니다.


사실, 대개 모든 다차원 배열을 처리할 때는 더 높은 모든 차원이 필요합니다. 그 말은 만약 우리가 3 차원 배열을 다룬다면 2차원 3차원은 인자의 정의를 지정해야합니다.

 

출처1 : https://github.com/aleksandar-todorovic/awesome-c

출처2 : http://home.netcom.com/~tjensen/ptr/pointers.htm