1. 포인터 배열이란
▶ 포인터 들의 배열이다.
배열의 요소가 포인터들로 이루어져 있다.
▶ 선언방법 : char* arr[3];
배열 요소의 자료형이 char* (포인터)인 배열
그 배열의 요소의 개수가 3개.
arr[0]은 어떤 메모리를 가리키고 있다. (포인터 이다)
arr[1]도 어떤 메모리를 가리키고 있다. (오호 포인터 이다)
arr[2]도 어떤 메모리를 가리키고 있다. (이것도 포인터 이다)
이 세개들의 배열이다.
char* arr[3]은 메모리 3곳을 가리키고 있는 배열 입니다.
▶ 포인터 배열 예제1) const char* 문자열 이용
#include<stdio.h>
int main(void) {
const char* arr[3]; //포인터 배열 선언.
int i;
arr[0] = "BlockDMask"; //arr[0]은 -> 문자열 주소를 가리킵니다.
arr[1] = "C Programming"; //arr[1]은 -> 문자열 주소를 가리킵니다.
arr[2] = "point_arr"; //arr[2]은 -> 문자열 주소를 가리킵니다.
for (i = 0; i < 3; i++)
{
printf("arr[%d] -> %s\n", i, arr[i]);
}
return 0;
}
▶ 포인터 배열 예제2) 동적할당을 이용
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void) {
char* arr[3];
char tmp[30]; //문자를 받을 char 배열 30자 까지만 받자
int len, i;
for (i = 0; i < 3; i++)
{
printf("[%d] : ", i);
scanf("%s", tmp); //문자열 입력받기
len = strlen(tmp) + 1; //문자열 길이 + 1 할당 ('\0' 문자 포함)
printf("[%d] : tmp \t주소 : %p\n", i, &tmp); //tmp 주소 출력
arr[i] = (char*)malloc(sizeof(char) * len); //메모리 할당
printf("[%d] : arr[%d]\t주소 : %p\n\n", i, i, &arr[i]); //할당받은 arr[i] 메모리 주소 출력
strcpy(arr[i], tmp); //문자열을 arr[i]가 가리키고 있는 메모리로 복사
}
printf("\n");
for (i = 0; i < 3; i++)
{
printf("arr[%d] = %s\t주소 : %p\n", i, arr[i], &arr[i]);
}
for (i = 0; i < 3; i++)
{
free(arr[i]); //메모리 해제
}
return 0;
}
2. 배열 포인터란
▶ 배열을 가리키는 "하나의 포인터" 입니다.
특정 사이즈의 배열'만' 가리킬 수 있는 하나의 포인터이다. (여러개가 아닙니다. 딱 하나의 포인터 입니다.)
음.. 특정 사이즈의 배열을 마치 하나의 새로운 타입이라고 생각하면 좀더 쉬울 듯 합니다. 그 새로운 타입을 가리키는 포인터 입니다.
▶ 선언 방법 "타입이름 (*변수명)[N]"
* 포인터가 타입쪽에 붙는게 아니라 변수이름 쪽에 소괄호 안에 붙게 됩니다.
선언 방법 = 타입이름 (*변수이름)[N]
▶ 선언예시
char (*arr)[3];
char 타입의 인덱스를 3개 가지고 있는 배열"을 가리키는 포인터입니다.
그냥 하나의 포인터라고 생각하시면됩니다.
int* pNum; 이거랑 같은 포인터의 종류 중에 하나인데, 단지 가리키는 타입이 다른것뿐 입니다.
pNum은 int 타입을 가리키는 것 뿐이고
여기 arr은 char타입의 배열 사이즈[3]인 타입을 가리키는 것 뿐 입니다.
기억합시다. 배열 포인터는. 그냥 하나의 포인터 이다.
▶ 배열 포인터 예제
#include <stdio.h>
int main(void)
{
char (*arr)[3];
char tmp1[3] = { 'b', 'l', 'o' };
char tmp2[3] = { 'c', 'k', '\0' }; //문자열의 끝을 알리는 '\0'을 추가
char tmp3[5] = { 'd', 'm', 'a', 's', 'k'}; //배열의 사이즈가 다릅니다. 가리키기 불가.
printf("tmp1[3]의 주소 : %p\n", tmp1);
printf("tmp2[3]의 주소 : %p\n", tmp2);
printf("tmp3[5]의 주소 : %p\n", tmp3);
printf("\n"); printf("\n");
arr = &tmp1; //arr은 tmp1의 주소를 가리킵니다.
printf("arr의 주소 : %p\t 문자열 : ", arr);
for (int i = 0; i < (int)sizeof(*arr); i++)
{
printf("%c", (*arr)[i]);
}
printf("\n");
arr = &tmp2; //arr은 tmp2의 주소를 가리킵니다.
printf("arr의 주소 : %p\t 문자열 : ", arr);
for (int i = 0; i < (int)sizeof(*arr); i++)
{
printf("%c", (*arr)[i]);
}
printf("\n");
//arr = &tmp3; 배열의 사이즈가 다르다는것은 타입이 다르다는 뜻 입니다.
return 0;
}
"포인터 배열"은 포인터가 여러개 모여서 배열로 있는것이고
"배열 포인터"는 배열 타입을 가리키는 하나의 포인터 라는 것 입니다.
출처: https://blockdmask.tistory.com/56 [개발자 지망생]