[C언어/C++] 포인터 배열, 배열 포인터의 사용법과 차이점
- Language/C , C++ , C#
- 2021. 1. 30.
포인터 배열이란?
포인터 배열이란 말 그대로 포인터를 배열로 나열해놓은 것을 말합니다. 즉 포인터 변수의 배열이죠. 각각의 index에 여러 개의 포인터를 넣을 수 있습니다.
char* arr[5];
int* arr[5];
void* arr[5];
위와 같이 선언하여 사용합니다. char* arr[5]는 5개의 char형 포인터를, int* arr[5]는 int형 포인터 5개를 저장하고 있는 배열이 됩니다. 그냥 단순 주소값만 저장하고 싶을 때는 주로 void로 선언하며 이렇게 선언할 경우 이후 어떤 타입이든지 변환이 가능합니다.
포인터 배열 활용 예제
#include <stdio.h>
int main() {
int num1 = 100;
int num2 = 200;
int num3 = 300;
int* arr[3] = { &num1, &num2, &num3 };
for (int i = 0; i < 3; i++) {
printf("arr[%d] = 주소값 : %p / 값 :%d\n",i,arr[i], *arr[i]);
}
}
크게 어려운 내용은 아니기에 위의 예제를 보시면 바로 이해가 되실 겁니다. 정말 단순히 포인터를 배열로 나열해놓은 것에 불과합니다.
위와 같이 포인터 배열의 Index마다 참조하는 주소값을 저장하여 활용할 수 있습니다.
배열 포인터란?
배열 포인터란 배열을 가리키는 포인터를 말합니다. 배열은 변수들을 메모리상에 일렬로 나열해놓은 것과 마찬가지입니다. 배열도 메모리상에 존재하므로 엄연히 주소값이 존재합니다. 배열 포인터란 이 주소값을 가리키는 포인터를 말합니다. 이것이 유용한 이유는 바로 2차원 이상의 배열을 가리킬 때 포인터를 통해 배열과 같은 인덱싱을 할 수 있기 때문입니다. 함수에 2차원 이상의 배열을 파라미터로 던질 때 유용하게 사용됩니다.
배열의 주소값
#include <stdio.h>
int main() {
int arr[3][3] = { {10, 20, 30}, {100, 200, 300}, {100, 200, 300}};
printf("arr의 주소값 : %p\n", &arr);
for (int i = 0; i < 3; i++) {
printf("arr[%d]의 주소값 : %p\n",i, &arr[i]);
for (int j = 0; j < 3; j++) {
printf("arr[%d][%d]의 주소값 : %p / 값 :%d\n", i, j, &arr[i][j], arr[i][j]);
}
}
}
위의 예제처럼 배열에 주소값을 찍어서 값을 확인하실 수 있습니다. 위의 예제에서 알 수 있듯 2차원 배열 arr은 arr[0][0]의 주소와 같으며 int형 배열이므로 주소값이 4씩 증가하는 것을 확인할 수 있습니다.
또한 2차원 배열을 선언하여 주소값을 확인해보면 1차원 배열의 주소는 2차원 배열의 [x][0]번째 주소를 가리킨다는 것을 알 수 있고 2차원 배열의 주소는 2차원 배열의[0][0]의 주소를 가리킨다는 것을 확인하실 수 있습니다. 이러한 성질을 활용하여 배열 포인터를 다양한 곳에서 활용할 수 있습니다.
배열 포인터 활용 예제 (2차원 배열을 함수의 파라미터로 보낼 때)
#include <stdio.h>
void change_array(int(*arr)[3]) { //배열 포인터
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
arr[i][j] = 0; //arr의 값 0으로 변경
}
}
}
int main() {
int arr[3][3] = { {10, 20, 30}, {100, 200, 300}, {100, 200, 300}};
change_array(arr);
//출력
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("arr[%d][%d] : %d ", i, j, arr[i][j]);
}
printf("\n");
}
}
함수에서 다차원 배열을 파라미터로 받아야 할 때 배열 포인터를 활용할 수 있습니다. 위와 같이 C언어의 함수에서 다차원 배열의 파라미터를 받을 때는 위와 같이 인자값에 배열 포인터를 넣어주어야 합니다.
'Language > C , C++ , C#' 카테고리의 다른 글
[C언어/C++] const 포인터와 키워드 위치에 따른 차이점 (0) | 2021.02.01 |
---|---|
[C언어/C++] 이중 포인터 사용법 & 예제 (0) | 2021.01.31 |
[C언어/C++] 비트 쪼개기 (Bit Split) 사용법 & 예제 (비트연산 활용) (2) | 2021.01.29 |
[C언어/C++] 비트 플래그 (Bit Flag) 사용법 & 예제 (비트연산 활용) (0) | 2021.01.29 |