본문 바로가기
프로그래밍/C, C++

[C언어] 배열포인터와 포인터배열의 차이

by JR2 2021. 1. 16.

코딩을 하다보면 가끔씩 포인터를 쓸 일이 있다.

그런데 항상 배열포인터와 포인터배열을 헷갈린다.

 

배열포인터 : Pointer To Array

배열을 가리키는 포인터

 

포인터배열 : Array Of Pointer

포인터들의 배열

 

우선 각각의 사용법을 알아보겠다.

1차원 배열 2차원 배열 (배열포인터) 2차원 배열 (포인터배열)
int arr[3] = {1, 2, 3, 4, 5};
int *ptr = arr;
int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*ptr)[3] = arr;
int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int *ptr[3] = arr;

알다시피 1차원 배열은 헷갈리지 않고 선언 할 수 있다.

 

하지만 배열포인터, 포인터배열은 너무 헷갈린다.

배열포인터 먼저 알아보겠다.

 

배열포인터는 2차원 배열을 1:1 매칭하기 위한 포인터라고 생각하면 이해가 편하다.

 

 

아래의 코드는 배열포인터의 여러 표현방법을 표현해 보았다.

#include <stdio.h>

int main(void)
{
	int arr[2][4] = { 1, 2,
		3, 4,
		5, 6,
		7, 8
	};
	int(*ptr)[4] = arr;

	printf("%2d, %2d\n", arr[0][0], ptr[0][0]);
	printf("%2d, %2d\n\n", arr[1][0], ptr[1][0]);

	printf("%2d, %2d\n", *(arr[0]), *(ptr[0]));
	printf("%2d, %2d\n\n", *(arr[1]), *(ptr[1]));

	printf("%2d, %2d\n", **(arr + 0), **(ptr + 0));
	printf("%2d, %2d\n\n", **(arr + 1), **(ptr + 1));

	printf("%2d, %2d\n", *(*(arr + 0) + 0), *(*(ptr + 0) + 0));
	printf("%2d, %2d\n", *(*(arr + 0) + 1), *(*(ptr + 0) + 1));
	printf("%2d, %2d\n", *(*(arr + 0) + 2), *(*(ptr + 0) + 2));
	printf("%2d, %2d\n\n", *(*(arr + 0) + 3), *(*(ptr + 0) + 3));


	printf("%2d, %2d\n", *(*(arr + 1) + 0), *(*(ptr + 1) + 0));
	printf("%2d, %2d\n", *(*(arr + 1) + 1), *(*(ptr + 1) + 1));
	printf("%2d, %2d\n", *(*(arr + 1) + 2), *(*(ptr + 1) + 2));
	printf("%2d, %2d\n", *(*(arr + 1) + 3), *(*(ptr + 1) + 3));

	return 0;
}

 

 

다음은 포인터 배열이다.

 

포인터 배열은 되게 직관적이라서 이해하기 쉽다.

int a=1; int b=2; int c=3;

int *ptr[3] = { &a, &b, &c };

 

포인터(주소)들의 집합이 포인터 배열이라고 생각하면 편하다.

#include <stdio.h>

int main(void)
{
	int a = 1;
	int b = 2;
	int c = 3;

	int* ptr[3] = { &a,&b,&c };

	printf("%d, %d, %d\n", *ptr[0], *ptr[1], *ptr[2]);
	printf("%d, %d, %d\n", **(ptr + 0), **(ptr + 1), **(ptr + 2));

	return 0;
}

 

 

하지만 이런식으로도 쓸 수 있다...

#include <stdio.h>

int main(void)
{
	int arr[2][4] = { 1,2,3,4,5,6,7,8 };

	int* ptr[2] = { arr[0], arr[1] };

	printf("%2d, %2d\n", arr[0][0], ptr[0][0]);
	printf("%2d, %2d\n\n", arr[1][0], ptr[1][0]);

	printf("%2d, %2d\n", *(arr[0]), *(ptr[0]));
	printf("%2d, %2d\n\n", *(arr[1]), *(ptr[1]));

	printf("%2d, %2d\n", **(arr + 0), **(ptr + 0));
	printf("%2d, %2d\n\n", **(arr + 1), **(ptr + 1));

	printf("%2d, %2d\n", *(*(arr + 0) + 0), *(*(ptr + 0) + 0));
	printf("%2d, %2d\n", *(*(arr + 0) + 1), *(*(ptr + 0) + 1));
	printf("%2d, %2d\n", *(*(arr + 0) + 2), *(*(ptr + 0) + 2));
	printf("%2d, %2d\n\n", *(*(arr + 0) + 3), *(*(ptr + 0) + 3));


	printf("%2d, %2d\n", *(*(arr + 1) + 0), *(*(ptr + 1) + 0));
	printf("%2d, %2d\n", *(*(arr + 1) + 1), *(*(ptr + 1) + 1));
	printf("%2d, %2d\n", *(*(arr + 1) + 2), *(*(ptr + 1) + 2));
	printf("%2d, %2d\n", *(*(arr + 1) + 3), *(*(ptr + 1) + 3));

	return 0;
}

 

이렇게 배열포인터, 포인터배열 이라는 기능이 나뉘고

결론은 쓰기 나름이라는 것이다.

댓글