Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 이중 포인터 완벽 가이드: 포인터 대 포인터 개념과 예제

포인터는 변수의 주소(address)를 저장하는 데 사용됩니다. 그렇다면 '포인터 대 포인터(pointer to pointer)', 즉 이중 포인터(double pointer)란 무엇일까요? 이중 포인터에서는 첫 번째 포인터가 두 번째 포인터의 주소를 저장하는 역할을 합니다. 이처럼 포인터가 또 다른 포인터를 가리키기 때문에 '이중 포인터'라고 부릅니다.

알고리즘

시작
    정수형 변수 v를 선언한다.
    v = 76으로 초기화한다.
    정수형 포인터 p1을 선언한다.
    정수형 이중 포인터 p2를 선언한다.
    p1을 변수 v를 가리키는 포인터로 초기화한다.
    p2를 포인터 p1을 가리키는 포인터로 초기화한다.
    "v의 값"을 출력한다.
        변수 v의 값을 출력한다.
    "단일 포인터를 사용한 v의 값"을 출력한다.
        포인터 p1이 가리키는 값을 출력한다.
    "이중 포인터를 사용한 v의 값"을 출력한다.
        이중 포인터 p2가 가리키는 값을 출력한다.
끝.

예제 코드

아래는 이중 포인터의 동작을 이해하기 위한 간단한 C 프로그램입니다.

#include <stdio.h>

int main() {
    int v = 76;      // 일반 정수 변수
    int *p1;         // 단일 포인터 선언
    int **p2;        // 이중 포인터 선언

    p1 = &v;         // p1에 변수 v의 주소 저장
    p2 = &p1;        // p2에 포인터 p1의 주소 저장

    printf("Value of v = %d\n", v);
    printf("Value of v using single pointer = %d\n", *p1);
    printf("Value of v using double pointer = %d\n", **p2);

    return 0;
}

실행 결과

Value of v = 76
Value of v using single pointer = 76
Value of v using double pointer = 76

동작 원리

세 가지 방식 모두 동일한 값 76이 출력되는 것을 확인할 수 있습니다. 그 이유는 다음과 같습니다.

  • v : 정수 값 76을 직접 저장하고 있는 변수입니다.
  • p1 : 변수 v의 메모리 주소를 저장합니다. 따라서 역참조 연산자 *를 사용한 *p1v의 값인 76이 됩니다.
  • p2 : 포인터 p1의 메모리 주소를 저장합니다. 역참조를 두 번 적용한 **p2는 먼저 p1에 접근한 뒤, 다시 v의 값에 접근하므로 결과적으로 76이 출력됩니다.

정리하면, 이중 포인터는 p2 → p1 → v와 같은 연쇄적인 참조 구조를 가지며, 함수에서 포인터 자체를 수정해야 하거나 2차원 배열을 동적으로 다룰 때 특히 유용하게 활용됩니다.