포인터와 배열의 공통점? 뭐가 있을까?
지금부터 자세히 알아보겠다.
혹시 포인터의 개념이 잘 잡혀있지 않다면 관련 서적으로 좀 더 공부하거나,
아래 포인터의 개념을 설명한 글을 이해하고 오길 바란다.
[C언어] 포인터가 대체 뭔데? / 쉽게 이해하는 포인터(Pointer)의 개념
(지금 포인터란 개념이 어려워도 스트레스 받지 말자. 많이 접하다 보면 익숙해진다.) 포인터란 무엇일까? 일상생활에서의 포인터는 어떤 화면을 가리키는 불빛이 나오는 물건 등으로 생각할
white-world.tistory.com
포인터 배열이란 각 배열의 값에 주소를 가지는 배열이다.
말 그대로 포인터변수(어떠한 변수를 가리키는 변수)가 배열로 있는 것이다.
(포인터배열과 배열포인터는 완전 다른 것이다.)
일반적으로 배열의 이름은 '포인터'라는 것에서 배열과 포인터의 첫번째 공통점이 생긴다.
무슨 말인가? 싶으면 아래 예제를 보자.
#include <stdio.h>
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
printf("%d\n", *arr);
printf("%d\n", arr[0]);
printf("%p\n", arr);
printf("%p\n", &arr[0]);
return 0;
}
코드에서 arr이 가리키는 곳의 값과 arr[0]의 값은 정확히 같다.
또한 arr의 값(주소)와 arr[0]의 주소가 같다. (arr의 값이라 한 것은, 본래 포인터변수는 값을 어떤 변수의 주소로 가지기 때문이다.)
여기서 arr은 배열의 0번지를 가리키므로, 포인터처럼 쓸 수 있다. (하지만 상수이므로 값을 바꿀 수는 없다.)
그럼 아래 예제를 보자.
#include <stdio.h>
int main()
{
int a = 1, b = 2, c = 3;
int* pArr[3] = { &a, &b, &c }; // 포인터 배열
printf("%d\n", *pArr[0]);
printf("%d\n", *pArr[1]);
printf("%d\n", *pArr[2]);
return 0;
}
예제에서 pArr의 각 배열 값에 a, b, c의 주소를 넣었다.
출력할 때는 일반적인 형태의 pArr[0]이 아닌, *pArr[0] 형태로 쓰여있다.
pArr[0]이 a의 주소를 가지고 있기 때문에, pArr[0]이 가진 주소가 가리키는 곳의 값, 즉 a의 값이 출력되는 것이다.
#include <stdio.h>
int main(void)
{
char* str = "hello";
printf("%s\n", str);
return 0;
}
여기서는 str에 직접 문자열을 넣지 않고, str이란 포인터 변수에 문자열의 주소를 저장했다.
정확히 말하면 문자열의 시작 주소(첫 글자 주소)를 포인터 변수에 저장했다.
더 잘 이해하기 위해 포인터 str의 구조를 그림으로 살펴보겠다.
#include <stdio.h>
int main()
{
char Arr[3][10] = { "Kim", "Hong","Lee" }; // 2차원배열
char* pArr[3] = { Arr[0], Arr[1], Arr[2] }; // 포인터배열
printf("%s\n", pArr[0]);
printf("%s\n", pArr[1]);
printf("%s\n", pArr[2]);
printf("%c\n", Arr[0][2]);
// arr[i] == *(arr + i)
printf("%s\n", *pArr); // Kim
printf("%s\n", *pArr + 1); // im
printf("%s\n", *pArr + 2); // m
printf("%s\n", *pArr); // Kim
printf("%s\n", *(pArr + 1)); // Hong
printf("%s\n", *(pArr + 2)); // Lee
printf("%s\n", *pArr);
printf("%c\n", **pArr);
return 0;
}
이 코드에서도 위 예제들에서 봤던 것처럼, 포인터 배열에 Arr의 요소들을 넣었다.
이젠 이해가 꽤 될 것이다.
코드와 결과를 비교하면서 자신이 생각한 논리가 맞는지 확인하길 바란다.
참고로, *pArr은 Kim을 뽑아내고,
**pArr은 K만을 뽑아낸다.
(Kim을 가진 요소가 포인터 배열의 가장 처음 요소이기 때문.)