C 언어(17) - 포인터 배열

C 언어 강의, 포인터 배열의 이해

Featured image

🔚 짧게 하는 복습

✅ 1. 배열의 메모리 구조를 안다.

✅ 2. 1차원 배열 포인터를 이용해 간접 참조를 한다.

✅ 3. 2차원 배열 포인터를 이용해 간접 참조를 한다

✅ 4. [] 연산자를 안다.

✅ 5. 배열 이름의 의미를 이해한다.

혹시 기억이 안 난다면, 다시 돌아가자


저번 시간의 내용이 정말 어려웠을 텐데, 시간을 들여서 이해했으면 좋겠다.

이번에는 배열 포인터가 아니라 포인터 배열에 대해 다룰 것인데, 이게 나중에 가면 비슷한 이름이 너무 많아져서 헷갈린다.

그럴 때는 항상 뒤에 오는 것이 정체성임을 기억하자.

학교에서 배울 때 배웠던 비유인데, 스파이더맨은 거미가 아니라 사람이고 아이언맨도 철이 아니라 사람이다.

그 이유는 이 정체성이기 때문이라고 했다.

이거처럼 배열 포인터는 포인터이고, 포인터 배열은 배열이다.


포인터 배열이란?

배열이 정수형 변수를 담으면 정수 배열, 실수형 변수를 담으면 실수 배열, 문자형 변수를 담으면 문자 배열이라고 하자.

그렇다면 포인터형 변수를 배열에 담으면?

그렇다, 포인터 배열이란 포인터형 변수를 원소로 가지는 배열이다.

예제를 통해 알아보자.

이는 아래의 그림으로 보면 직관적으로 이해가 되고, 이는 다른 자료형에도 똑같이 적용된다. (편의상 1칸을 4바이트, 주소는 임의로 정했다.)


포인터 배열로 다차원 배열 만들기

포인터 배열을 이용하면, 2차원 배열과 비슷한 효과를 내는 포인터 배열을 만들 수도 있다.

1차원 배열 포인터의 배열을 만들면 되기 때문이다.

각각의 1차원 배열 포인터는 다른 배열들을 가리키면 되는 것이다.

그리고 확장하면 이런 것도 가능하다.

여기서 헷갈리는 점은, 2차원 배열 포인터를 저장하는 포인터 배열을 만들 때는 그냥 이중 포인터 배열을 쓰면 된다는 점이다.

이는 3차원 배열 포인터를 저장할 때는 삼중 포인터 배열을 쓰면 된다는 사실로 일반화할 수 있다.

하지만 이는 이렇게 할 수 있음을 보여주는 것뿐, 다차원 배열을 만들 때는 특수한 경우가 아니면 포인터 배열을 이용해서 만들지 말자. (알아보기 힘들다.)


📖 오늘의 핵심(다 알기 전까지는 넘어가지 말자❗)

✅ 1. 포인터 배열이 무엇인지 안다.

✅ 2. 포인터 배열을 응용해서 다차원 배열을 구현해보자.

⚠️ 배열 포인터와 포인터 배열을 헷갈리지 말자.

💣 과제,

  1. 2차원 배열과 포인터 배열을 이용해 구현한 2차원 배열의 차이를 설명하라(난이도 中) (메모리 구조를 생각해보라)

🔜 더 공부해보기,

#include <stdio.h>
#include <stdlib.h>//아직은 몰라도 된다.

int main() {
    int num = 123;
    double dbl = 456.789;
    char ch = 'A';

    void* arr[3]; //void형 포인터를 이용해서 포인터 배열을 만든다.

    arr[0] = &num;
    arr[1] = &dbl;
    arr[2] = &ch;
    //다양한 자료형을 넣는 배열을 만들어 낼 수 있다.

    // void 포인터로 저장된 주소를 사용하여 각 데이터 형식에 접근
    printf("Integer: %d\n", *(int*)arr[0]);
    printf("Double: %lf\n", *(double*)arr[1]);
    printf("Char: %c\n", *(char*)arr[2]);

    return 0;
}
  1. 읽어볼 거리(1) - void형 포인터(이를 읽고 위 코드를 보자)

  2. 읽어볼 거리(2) - 실제로 파이썬은 다양한 자료를 담는 배열(리스트)이 가능하다!