Home 배열 포인터(array pointer)와 포인터 배열(pointer array) 차이 정리
Post
Cancel

배열 포인터(array pointer)와 포인터 배열(pointer array) 차이 정리

C/C++에서는 메모리를 직접 제어하기 위해서 포인터를 사용합니다. 그러면서 포인터에서 파생되는 개념이 많은데 배열포인터/포인터배열도 마찬가지 입니다. 만약 본인이 C를 공부를하고 있다면 이것을 피할 수가 없으니 꼭 짚고 넘어갑시다.

1. 포인터 배열 pointer array

포인터 배열은 포인터들의 배열입니다. 즉 배열의 요소가 포인터 들로 이루어져 있습니다.

img1 view

배열은 자료형을 정의를 해주어야 합니다. 나는 어떤 것을 담을지 선언을 해야하는데 포인터 배열은 어떤 자료형의 포인터들이 가득 들어 있다는 것을 생각해볼 수 있습니다.

그렇다면 위 그림처럼 직접적으로 어떤 값이나 단어를 가지는것이 아니라 그 값이나 단어의 위치(주소)를 배열로 담고 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS

int main(void){
	const char* arr[3];

	arr[0] = "AAA";
	arr[1] = "BBB";
	arr[2] = "CCC";
	
	for (int i = 0; i < 3 ; i++) {
		printf("arr[%d]이 가르키는 값은 : %s\n", i, arr[i]);
	}

	return 0;
}

point

얼핏보면 그냥 배열에다가 문자열을 넣는게 아닌가 하지만 다시한번 생각하셔야 할게 있습니다. 배열의 이름은 주소입니다. char* 포인터 배열을 사용했으며 그냥 포인터가 아닌 배열을 사용했다면 한글자만 담을 수 있습니다. 하지만 포인터로 선언한 다음 각 문자열 주소에다가 어떤 것을 저장할지 지정을 해주게 되고 이를 바탕으로 불러오는 값입니다.

동적할당과 정적할당 차이 정리 (malloc, free) 함수 사용법

마찬가지로 const char* 대신 입력을 받아서 maloc로 동적할당을 하는것 역시 가능합니다.

1
arr[i] = (char*)malloc(sizeof(char) * len);

그럴때는 길이를 입력받아서 동적할당을 하면 됩니다.

2. 배열 포인터 array pointer

배열을 가리키는 하나의 포인터입니다. 그러니까 특정 사이즈의 배열만 가리킬 수 있는 하나의 포인터가 됩니다.

img1 daumcdn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS

int main(void){
	char(*arr)[3];

	char temp_1[3] = "AAA";
	char temp_2[3] = "BBB";
	char temp_3[3] = "CCC";
	printf("temp_1[3]의 주소 : %p\n", temp_1);
	printf("temp_2[3]의 주소 : %p\n", temp_2);
	printf("temp_3[3]의 주소 : %p\n", temp_3);
	
	arr = &temp_1;
	printf("arr의 주소 : %p\t 문자열 : ", arr);
	for(int i=0; i< (int)sizeof(*arr); i++){
		printf("%c", (*arr)[i]);
	}
	printf("\n");

	arr = &temp_2;
	printf("arr의 주소 : %p\t 문자열 : ", arr);
	for (int i = 0; i < (int)sizeof(*arr); i++) {
		printf("%c", (*arr)[i]);
	}
	printf("\n");

	arr = &temp_3;
	printf("arr의 주소 : %p\t 문자열 : ", arr);
	for (int i = 0; i < (int)sizeof(*arr); i++) {
		printf("%c", (*arr)[i]);
	}
	printf("\n");

	return 0;
}

img1 daumcdn

한글 출력이 매끄럽지 않아서 좀 이상하게 보일지모르겠는데 주소값만 보시면 됩니다.

temp_1, temp_2, temp_3를 참조하면 arr주소도 똑같이 가르키는 것을 볼 수 있습니다.

그렇다면 char[5]를 참조하면요?

img1 daumcdn

temp_3를 5개로 해서 출력을 하면 에러는 뜨지 않지만 문자열이 CCCCC가 아니라 3개로 짤립니다.

컴파일러에 따라서 에러를 출력할 수도 있습니다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.

scanf 입력 버퍼 지우기, 초기화 하는 방법

C언어에서 const를 사용하는 이유와 선언의 의미