티스토리 뷰

Daylogs/C

C: 다차원 배열과 포인터

ohgyun 2016. 4. 23. 20:27
이전 글: 4. 포인터와 배열에서 계속



다차원 배열

int[행][열]

2차원 배열도 메모리상에는 1차원 형태로 존재한다.



포인터의 포인터 = 더블 포인터 변수
포인터를 가리키는 값

int n = 3;
int *p = &n;
int **pp = &p;

(예: 포인터 변수를 이용한 Swap) (p.364)


포인터 배열과 포인터 배열의 포인터 형
int * arr[3] = {p1, p2, p3}; // int형 포인터를 인자로 가지고 있는 배열
int **ptr = arr; // int형 포인터를 가리키는 포인터 (더블 포인터)


다중 포인터가 왜 필요한가?
- 자료구조를 공부하다 보면 완전 필요하다
- 함수 내에서 함수 외부에 선언된 변수에 접근하는 방법을 제시해준다.



다차원 배열과 포인터

2차원 배열이름의 포인터 형

행/열로 나누었을 때 첫 번째 행을 가리킨다.
2차원 배열의 포인터를 결정할 때에는 다음 정보를 포함해야 한다.
- 가리키는 대상은 무엇인가?
- 배열이름(포인터)를 대상으로 값을 1 증가 및 감소 시 실제로는 얼마가 증가 및 감소하는가?

int arr[3][4];
- arr이 가리키는 것은 int형 변수
- arr값을 1증가하면, sizeof(int) x 4 크기만큼 주소값이 증가하는 포인터 형
  즉, 포인터 연산 시 sizeof(int) x 4 크기 단위로 값이 증가 및 감소하는 포인터 형

다음과 같이 정의한다.
int (*ptr) [4]; // 배열 포인터 변수
--- ------- ----
 A    B       C

A = int를 가리키는,
B = 포인터 변수
C = 포인터 연산 시 4칸식 건너뜀


!!! 주의
'배열 포인터'와 '포인터 배열'을 혼동하지 말자.
int * arr[4]; // 포인터 배열 : int형 포인터 변수로 이루어진 int형 포인터 배열
int (*arr) [4]; // 배열 포인터 : 열이 4개인 int형 2차원 배열을 가리키는 포인터 변수


2차원 배열의 포인터를 매개변수로 전달하기 
void show(int arr[][4]);
void show(int (*arr)[4]);

2차원 배열의 행의 개수
int arr[ROW][COLUMN]
sizeof(arr) / sizeof(arr[0])

아래 값은 모두 동일하다. 
arr[2][1]
(*(arr+2))[1]
*(arr[2]+1)
*(*(arr+2)+1)

즉, arr[i] = *(arr + i)




반응형
댓글
공지사항