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

C 언어 이중 포인터(Pointer to Pointer): 포인터 간의 관계를 보여주는 프로그램

C 프로그래밍 언어에서 이중 포인터(double pointer), 즉 '포인터를 가리키는 포인터(pointer to pointer)'는 다른 포인터의 주소값을 저장하는 변수입니다. 일반 포인터가 변수의 주소를 저장하는 것과 달리, 이중 포인터는 포인터 변수 자체의 주소를 가리킨다는 점이 특징입니다.

선언 방법

포인터를 가리키는 포인터는 별표(*) 두 개를 사용하여 다음과 같이 선언합니다.

datatype ** pointer_name;

예를 들어 다음과 같습니다.

int **p;

여기서 p는 int형 변수를 가리키는 포인터를 다시 가리키는 이중 포인터입니다.

초기화

이중 포인터의 초기화에는 주소 연산자 '&'를 사용합니다. 예시는 다음과 같습니다.

int a = 10;
int *p;
int **q;
p = &a;

위 코드에서 p는 변수 a의 주소를 저장하고, q는 포인터 p의 주소를 저장하게 됩니다.

값 접근하기

이중 포인터가 가리키는 실제 값에 접근하려면 간접 참조 연산자(indirection operator, '*')를 사용합니다. 한 번 역참조(*)하면 포인터가 저장된 값(즉, 변수의 주소)에 접근하고, 두 번 역참조(**)하면 최종적으로 원래 변수의 값에 접근할 수 있습니다.

예제 프로그램 1: 기본적인 이중 포인터 활용

다음은 이중 포인터의 기본 동작을 보여주는 C 프로그램입니다.

#include<stdio.h>
main ( ){
    int a = 10;
    int *p;
    int **q;
    p = &a;
    q = &p;
    printf("a =%d ",a);
    printf(" a value through pointer = %d", *p);
    printf(" a value through pointer to pointer = %d", **q);
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

a=10
a value through pointer = 10
a value through pointer to pointer = 10

변수 a의 값을 직접 출력한 결과, 포인터 p를 통해 접근한 결과, 그리고 이중 포인터 q를 통해 접근한 결과가 모두 10으로 동일함을 확인할 수 있습니다.

예제 프로그램 2: 포인터 간의 관계 상세 분석

이번에는 변수, 포인터, 이중 포인터 사이의 관계를 더 자세히 살펴보는 C 프로그램입니다.

#include<stdio.h>
void main(){
    //변수와 포인터 선언//
    int a=10;
    int *p;
    p=&a;
    int **q;
    q=&p;
    //결과 출력//
    printf("Value of a is %d
",a);//10//
    printf("Address location of a is %d
",p);//a의 주소//
    printf("Value of p which is address location of a is %d
",*p);//10//
    printf("Address location of p is %d
",q);//p의 주소//
    printf("Value at address location q(which is address location of p) is %d
",*q);//a의 주소//
    printf("Value at address location p(which is address location of a) is %d
",**q);//10//
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

Value of a is 10
Address location of a is 6422036
Value of p which is address location of a is 10
Address location of p is 6422024
Value at address location q(which is address location of p) is 6422036
Value at address location p(which is address location of a) is 10

실행 결과 해설

출력 결과를 단계별로 분석하면 다음과 같은 관계를 확인할 수 있습니다.

  • a = 10: 변수 a 자체의 값입니다.
  • p = 6422036: 포인터 p에 저장된 값으로, 변수 a의 메모리 주소입니다.
  • *p = 10: p가 가리키는 주소에 저장된 값, 즉 a의 값입니다.
  • q = 6422024: 이중 포인터 q에 저장된 값으로, 포인터 p의 메모리 주소입니다.
  • *q = 6422036: q가 가리키는 주소(p의 주소)에 저장된 값, 즉 a의 주소입니다.
  • **q = 10: 이중 역참조를 통해 최종적으로 도달한 a의 값입니다.

이처럼 이중 포인터는 포인터의 주소를 거쳐 원래 변수의 값까지 두 단계에 걸쳐 접근하는 구조이며, 2차원 배열 처리나 동적 메모리 할당, 함수에서 포인터 자체를 수정해야 하는 경우 등에 유용하게 활용됩니다.