본문 바로가기

awesome-c Beginner 번역/A tutorial on pointers

<비공식 번역>awesome-c Beginner 번역 : CHAPTER 8 : Pointers to Arrays

현재위치



<주의!!>

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




CHAPTER 8: Pointers to Arrays (챕터 8: 배열에 포인터)


물론 포인터는 어떠한 데이터 객체든지 "가리킬" 수 있습니다. 배열을 포함해서 말이죠. 우리가 program 3.1을 논의하는 동안 그 사실은 명백했습니다. 다차원 배열에 대해서 어떻게 우리가 할 것인지를 확장하는 것은 중요합니다.


Chapter2를 검토해보죠. 우리는 배열사용에서 integer 포인터로 가리킬 수 있었던 주어진 integer 배열을 다뤄왔습니다.


int *ptr;

ptr = &my_array[0];        /* point our pointer at the first integer in out array */


우리가 언급한 바와 같이, 포인터 변수의 타입은 그 배열의 첫번째 요소의 타입과 일치해야만 합니다.


게다가 우리는 포인터를 배열조작을 위해 설계한 함수의 형식 인자로 사용할 수 있습니다. 예를 들면 이와 같이 주어질 때:


int array[3] = {1, 5, 7};

void a_func(int *p);


몇몇 프로그래머들은 함수의 프로토타입을 다음과 같이 쓰길 좋아할지도 모릅니다.


void a_func(int p[]);


배열의 요소를 조작하도록 설계한 함수임을 알리려는 경향일 수도 있습니다. 물론 두 케이스 다 배열의 첫번째 요소의 포인터의 값이 전달됩니다. 표기법의 독립성은 함수의 프로토타입 또는 정의에 사용됩니다. 배열 표기법이 사용되는 경우, 배열 전체를 전달하지 않기 때문에 실제 배열의 치수를 전달할 필요는 없습니다. 오직 첫번째 요소의 주소만을 전달합니다.


이제 2차원 배열의 문제로 시야를 돌리겠습니다. 지난 챕터에서 C는 2차원 배열을 1차원 배열의 형태처럼 해석합니다. 즉, 2차원 integer배열의 첫번째 요소는 1차원 integer배열과 동일하게 봅니다. 그리고 2차원 integer배열의 포인터는 해당 데이터 타입에 대한 포인터여야 합니다. 이것을 달성하는 방법은 "typedef"을 사용하는 것입니다. typedef은 데이터 타입의 새 이름을 지정합니다. 예를 보시죠:


typedef unsigned char byte;


이 문장으로 인해 이름 byteunsigned char를 의미합니다. 따라서


byte b[10];  은 unsigned char의 배열이 됩니다.


typedef 선언에 주의하여 byte란 단어는 우리가 unsigned char라고 사용하는 이름을 대체했습니다. 그것은 typedef 사용규칙이 기존에 사용하던 데이타 타입에 새 이름을 부여하는 것을 의미합니다. 따라서:


typedef int Array[10];


배열은 정수10개 배열의 데이터 타입이 되었습니다. 즉, Array my_arr;my_arr을 정수10개 배열로 선언한 것이 됩니다. 그리고 Array arr2d[5];라고 쓰면 10 integer배열이 5개있는 배열 arr2d가 만들어집니다.


또한 Array *p1d;p1d을 정수10개 배열을 가리키는 포인터로 만들었습니다. *p1d이 동일한 타입 arr2d를 가리키기 때문에, 2차원 배열 arr2d에 대한 p1d에 할당되는 주소는 정수10개인 1차원 배열의 포인터로 허용합니다. 즉, p1d = &arr2d[0]; 혹은 pld = arr2d; 입니다.


우리 포인터에 사용할 데이터 타입은 정수10개 배열이기 때문에 p1d의 값이 1만큼 증가하면 그 값은 실제론 10*sizeof(int)으로 예상합니다. 즉, sizeof(*p1d)는 20입니다. 여러분은 스스로 이 표현을 사용하여 간단한 프로그램을 작성하고 실행해봄으로써 증명할 수 있습니다.


이제, typedef은 프로그래머에서 쉽고 명확하게 읽히도록 만들지만 이것이 정말 필수요소는 아닙니다. 우리가 필요한 것은 p1d같은 포인터를 typedef 키워드 없이도 선언하는 방법입니다. 아래는 그 작업을 하고 있음을 밝히는 내용입니다.


int (*p1d)[10];


이것은 적절한 선언입니다. 즉, p1d는 Array 타입을 사용한 선언하에서 정수10개 배열의 포인터입니다. 둘의 차이점을 주목합시다.


int *p1d[10];


여기서 p1d는 10개의 int 타입 포인터의 배열의 이름입니다.

 

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

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