거북이처럼 천천히

Pointer arry (포인터 배열) 본문

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)

'C' 카테고리의 다른 글

배열 포인터  (1) 2024.06.19
이중 포인터  (1) 2024.06.19
Register variable  (0) 2024.06.18
C 언어의 컴파일 과정  (0) 2024.06.06
Deque  (0) 2024.05.31