코딩을 하다보면 가끔씩 포인터를 쓸 일이 있다.
그런데 항상 배열포인터와 포인터배열을 헷갈린다.
배열포인터 : 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;
}
이렇게 배열포인터, 포인터배열 이라는 기능이 나뉘고
결론은 쓰기 나름이라는 것이다.
'프로그래밍 > C, C++' 카테고리의 다른 글
[C언어] ' " ! @ # $ % ^ & * ( ) 출력하기 (0) | 2021.04.01 |
---|---|
[C#] ToInt, Convert to int (0) | 2021.03.21 |
[C언어] 구조체 포인터 .연산자 ->연산자 (0) | 2021.01.24 |
[C언어] 구조체란 무엇인가. (0) | 2021.01.19 |
[C언어] typedef 이란 무엇인가 (0) | 2021.01.19 |
댓글