C
Pointer arry (포인터 배열)
유로 청년
2024. 6. 18. 19:32
1. 포인트 배열이란 무엇인가?
- 같은 자료형을 갖는 포인트들을 모아 만든 배열
- 포인트 선언과 포인트 배열 선언은 다음과 같다.
// 포인트 선언
int *p_data;
// 포인트 배열 선언
// int *형 포인트를 3개를 모아 만든 배열
int *p_arry[3]
2. 포인트 배열의 사용 예시
- 포인터 배열로 여러 개의 문자열을 저장 및 출력.
#include <stdio.h>
int main(void) {
char* p_string[5];
p_string[0] = "dog";
p_string[1] = "elephant";
p_string[2] = "horse";
p_string[3] = "tiger";
p_string[4] = "lion";
for (unsigned char i = 0; i < (int)(sizeof(p_string) / sizeof(p_string[0])); i++)
printf("%s\n", p_string[i]);
return 0;
}
- p_string 배열명을 갖는 배열을 생성하였으며, 각각 원소들은 char *형 포인터이다.
- 대입 연산자를 통해 문자열 상수의 주소 값을 각각 원소인 char*형 포인터에 저장한다.
3. 포인트 배열의 초기화
// 1차원 포인터 배열 초기화
char *p_array[5] = {"dog", "elephant", "horse", "tiger", "lion"};
// 2차원 배열 초기화
char animail[5][20] = {"dog", "elephant", "horse", "tiger", "lion"};
- 1차원 포인터 배열은 각각의 문자열 상수의 메모리 주소값을 저장한다.
- 2차원 배열은 2차원 배열 공간에 각 문자를 저장한다.
4. 포인터 배열의 활용 - 2차원 배열으로 활용
- 이전 예시에서 보았던 포인터 배열에 문자열을 저장했던 것처럼 포인터 배열을 2차원 배열처럼 활용할 수 있다.
- 다음은 포인터 배열을 2차원 배열처럼 활용한 예시이다.
#include <stdio.h>
int main(void) {
int p_array0[4] = {1, 2, 3, 4};
int p_array1[5] = { 5, 6, 7, 8, 9 };
int p_array2[6] = { 10, 11, 12, 13, 14, 15 };
int* p_list_of_array[3] = { p_array0, p_array1, p_array2 };
int size[3] = { 4, 5, 6 };
for (unsigned char i = 0; i < 3; i++) {
for (unsigned char j = 0; j < size[i]; j++) printf("%5d", p_list_of_array[i][j]);
printf("\n");
}
return 0;
}
- p_array0, p_array1, p_array2 는 int형 배열이지만, 각각 사이즈가 다른 int형 배열이다.
- 각각 배열명은 첫 번째 원소가 저장된 메모리 공간의 주소값을 갖는다.
- 포인터 배열인 p_list_of_array는 int*형 배열이며, 각 원소들은 int *형 포인터이다.
- 포인터 배열인 p_list_of_array를 초기화하면서 각 포인터 원소에 대입했기 때문에 각 원소들은 각 배열의 첫 번째 메모리 공간의 주소값을 갖는다.
- p_list_of_array[0] = p_array0, p_list_of_array[1] = p_array1, p_list_of_array[2] = p_array2
- 따라서 2차원 배열처럼 포인터 배열을 활용할 수 있다.
5. 2차원 배열이 아닌 포인터 주소 연산을 통해 접근
- 위 예시에서 포인터 배열을 2차원 배열처럼 활용할 수 있다고 했다.
- 따라서 2차원 배열의 원소 접근 방식을 사용할 수 있었지만, 포인터 주소 연산을 통해 접근은 어떻게 할까?
- "포인터 배열의 각 원소는 배열의 첫 번째 원소의 메모리 주소 값이다." 라는 점을 이용하면 다음과 같이 작성할 수 있다.
// 2차원 배열 접근
p_array[2][3]
// 포인터 주소 연산
*(p_array[2]+3)