이 전시간 포인터 배열에 대해서 알아보았다. 이번에는 배열 포인터에 대해서 간단히 알아보고 구조체로 넘어갈까 한다. 문자열도 다뤄야하는데 사실 배열과 문자열에 관한 내용은 천천히 다루는게 좋지않을까 싶다. 문자열을 다루는 것이 그만큼 배열과 밀접하고 중요하기 때문이다. 또한 포인터의 개념도 완벽히 잡히지 않은 상태에서 다루다보면 이도 저도 안되기 때문이다. 그래서 문자열과 배열을 한번에 너무 깊게 다루는 것은 전반적인 C학습에 저해 요소라 생각든다. 이 부분은 어떤 프로젝트를 하면서 그때 그때 필요한 부분을 익히는 것이 더 효율적이라 생각들고, 문법을 공부하는 입장에서는 C의 전반적인 흐름을 익히는 것이 중요하다 생각된다. 이 블로그의 포스팅의 목표는 간단한 주소록을 시작으로 채팅프로그램, 그리고 C++ 중요문법과, 알고리즘들을 다루고, 게임을 만드는 것이다. 아무튼 모든 것에는 순서가 있기 때문에, 차근 차근 포스팅을 해 나가겠다.
부분 배열
배열 포인터에 대해서 알아보기 앞서 부분배열의 개념을 알아야한다.
2차 배열, 3차 배열, ....다차배열은 사실 메모리상에서는 1차원 구조다.
다음 그림은 2차원 배열의 메모리상의 구조를 나타낸 것이다. 첫 번째 첨자 3은 연두색의 3등분된 공간의 크기를 나타내며 각각의 연두색 공간에 다시 두 번째 첨자크기(4)의 배열이 들어서있다.
이런씩으로 3차원배열을 선언하고 싶다면 순서대로 arr[3][4][5] 첨자를 붙인후 각각의 노란색 안에 첨자만큼(5)의 공간을 할당하면 된다.
이런 다차원 배열은 배열의 요소안에 배열을 집어넣는 구조기 때문에, 배열을 각각 때어서 생각할 수 있다. 이렇게 따로따로 나누어 부분배열이라는 개념으로 사용할 수 있다.
계속 위 그림을 가지고 이야기 해보자
1. 배열의 정의에 따라서 arr은 배열명이자 배열 전체를 나타낸다.
2. arr[0],arr[1],arr[2]의 경우는 각각 arr[0][4], arr[1][4], arr[2][4]의 배열명이 된다. 즉 arr은 arr[0],arr[1],arr[2]의 부분배열을 갖는다. 이런 각각의 배열들은 배열의 성질을 고스란히 갖는다. 즉, 부분배열명도 포인터 상수가 된다.
생소한 개념일 수는 있지만, 이해하기가 어려운 것은 아니다.
이런식으로 3차,4차원 배열의 경우도 부분배열로 따로 나누어 생각 할 수 있다.
배열 포인터
부분 배열의 개념에 대해서 이해했다면 배열 포인터를 이해할 차례다.
포인터 배열과 비교를 해보보면서 이해해보자.
2014/02/14 - [프로그래밍/C언어] - 포인터배열(Ragged) c언어
선언방식은 다음과 같다.
포인터 배열과 배열 포인터의 차이점
포인터 배열 : *arr[5] // 배열의 요소가 포인터가 된다.
배열 포인터 : (*arr)[5] // 각각의 부분배열을 가리키는 포인터를 선언한다.
여기서 배열 포인터의 선언방식을 보면 ()가 되어있는 점이 포인터 배열과 차이점이라는 것을 잘 알아두고, 배열 포인터의 동작을 알아보자.
우선 포인터 배열의 경우 위 선언은 1차원배열이고 각 요소가 각각 포인터라는 말이 된다.
배열 포인터의 경우는 1차원 배열의 경우는 선언할 수 없다. 배열포인터는 다차원 배열의 부분배열을 나타내기 위해서 선언하는 건데 1차원 배열은 부분 배열이 없기 때문이다. 그러면 위 선언 방식은 2차원 배열의 부분배열을 대표함을 뜻한다. 즉 첫번째 첨자를 생략 한후 선언한다. 다음은 부분 배열을 이해하기 위한 코딩이다.
arr이라는 배열의 배열포인터 ap를 선언하고 ap의 동작이 어떤지 알아보았다. 결과는 84, 28이 나온다.
arr[0], arr[1], arr[2]과 ap[0], ap[1], ap[2]는 같은 의미인데, 여기서 주의할 점은 ap와 arr이 같지 않다는 것이다. 부분배열을 가리키는 ap는 그 자체로는 단순히 포인터이기 때문이다. 결국 사용법은 같은데 배열 포인터는 부분배열을 나타낼때 사용하는 것이다.
즉 위 배열 포인터의 선언을 좀 더 자세히 풀어말하자면 구성요소의 개수가 7개인 부분배열의 포인터 이고
ap[0], *ap, *ap++, *(ap+1) 이런식으로 사용한다. 함수로 넘기는 동작도 배열 포인터를 가지고 넘길수 있고.. 뭐. 아무튼 배열포인터의 경우 그렇게 많이 사용 하지 않기 때문에, 개념만 파악하고 넘어가도록하자.