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 [개발자 지망생]

'C 언어' 카테고리의 다른 글

포인터 배열 vs 배열 포인터 (응용)  (0) 2022.07.27
getopt  (0) 2022.07.27
함수 포인터  (0) 2022.07.27
%*.*s  (0) 2022.07.27
EOF와 feof  (0) 2022.07.27

+ Recent posts