C/C++에서는 메모리를 직접 제어하기 위해서 포인터를 사용합니다. 그러면서 포인터에서 파생되는 개념이 많은데 배열포인터/포인터배열도 마찬가지 입니다. 만약 본인이 C를 공부를하고 있다면 이것을 피할 수가 없으니 꼭 짚고 넘어갑시다.
1. 포인터 배열 pointer array
포인터 배열은 포인터들의 배열입니다. 즉 배열의 요소가 포인터 들로 이루어져 있습니다.
배열은 자료형을 정의를 해주어야 합니다. 나는 어떤 것을 담을지 선언을 해야하는데 포인터 배열은 어떤 자료형의 포인터들이 가득 들어 있다는 것을 생각해볼 수 있습니다.
그렇다면 위 그림처럼 직접적으로 어떤 값이나 단어를 가지는것이 아니라 그 값이나 단어의 위치(주소)를 배열로 담고 있습니다.
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;
}
얼핏보면 그냥 배열에다가 문자열을 넣는게 아닌가 하지만 다시한번 생각하셔야 할게 있습니다. 배열의 이름은 주소입니다. char* 포인터 배열을 사용했으며 그냥 포인터가 아닌 배열을 사용했다면 한글자만 담을 수 있습니다. 하지만 포인터로 선언한 다음 각 문자열 주소에다가 어떤 것을 저장할지 지정을 해주게 되고 이를 바탕으로 불러오는 값입니다.
동적할당과 정적할당 차이 정리 (malloc, free) 함수 사용법
마찬가지로 const char* 대신 입력을 받아서 maloc로 동적할당을 하는것 역시 가능합니다.
1
arr[i] = (char*)malloc(sizeof(char) * len);
그럴때는 길이를 입력받아서 동적할당을 하면 됩니다.
2. 배열 포인터 array pointer
배열을 가리키는 하나의 포인터입니다. 그러니까 특정 사이즈의 배열만 가리킬 수 있는 하나의 포인터가 됩니다.
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;
}
한글 출력이 매끄럽지 않아서 좀 이상하게 보일지모르겠는데 주소값만 보시면 됩니다.
temp_1, temp_2, temp_3를 참조하면 arr주소도 똑같이 가르키는 것을 볼 수 있습니다.
그렇다면 char[5]를 참조하면요?
temp_3를 5개로 해서 출력을 하면 에러는 뜨지 않지만 문자열이 CCCCC가 아니라 3개로 짤립니다.
컴파일러에 따라서 에러를 출력할 수도 있습니다.
Comments powered by Disqus.