Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

냥집사의 개발일지

C언어 - 이중 포인터 (Pointer to Pointer) 본문

C언어

C언어 - 이중 포인터 (Pointer to Pointer)

깅햄찌 2022. 9. 16. 20:23
반응형

안녕하세요 오늘은 이중 포인터에 대해 정리해보겠습니다. 

 

1. 이중 포인터

포인터도 하나의 변수이므로 그 주소가 있습니다. 이중 포인터란 포인터를 가리키는 포인터라고 할 수 있습니다.

이중 포인터의 선언 방법 -> 가리키는 자료형 + 간접 참조 연산자 + 포인터 변수

ex) int** ppt, double** ppt

temp는 정수형 변수

ptemp는 정수형 변수 temp를 가리키는 포인터 변수

pptemp는 포인터 변수 ptemp을 가리키는 포인터 변수

#include <stdio.h>

int main(){
    int temp = 5;
    int* ptemp = &temp;
    int** pptemp = &ptemp;

    printf("*ptemp : %d\n",*ptemp);
    printf("**pptemp : %d\n", **pptemp);
    printf("\n");
    printf("&temp : %u\n", &temp);
    printf("ptemp : %u\n", ptemp);
    printf("*pptemp : %u\n", *pptemp);

    return 0;
}

아래 결과에서 알 수 있듯이 pptemp는 ptemp를 가리키고 ptemp는 temp를 가리킵니다. 

**pptemp가 5를 출력하는 이유를 정리해봅시다. 

**pptemp -> *(*pptemp) -> *(ptemp) -> temp

위처럼 **pptemp가 temp를 가리키게 되는 걸 알 수 있습니다. 

 

2. 이중 포인터의 활용(1)

포인터 값을 바꾸는 함수의 매개변수 역할

아래 코드는 2개의 문자열을 서로 바꾸는 함수에 매개변수로 이중 포인터를 활용합니다.  

 

p1은 hello를 가리키는 포인터 변수

p2는 world를 가리키는 포인터 변수

pp1은 hello를 가리키는 포인터 변수를 가리키는 이중 포인터 변수

pp2은 world를 가리키는 포인터 변수를 가리키는 이중 포인터 변수

(뭔가 말장난 같네요 ㅎ)

#include <stdio.h>

void swap_pointer(char** pp1, char** pp2){
    char* ptemp;
    ptemp = *pp1;
    *pp1 = *pp2;
    *pp2 = ptemp;
}

int main(){
    char* p1 = "hello";
    char* p2 = "world";

    printf("before swap\n");
    printf("p1 : %s , p2 : %s\n",p1,p2);
    swap_pointer(&p1, &p2);
    printf("after swap\n");
    printf("p1 : %s , p2 : %s\n",p1,p2);

    return 0;
}

pp1은 p1의 주소 값

*pp1은 p1

p1은 hello의 시작 주소 값

 

pp2는 p2의 주소 값

*pp2는 p2

p2는 world의 시작 주소 값

 

즉, p1(hello의 시작 주소 값)과 p2( world의 시작 주소 값)를를 swap 했으므로

아래 결과처럼 문자열이 바뀐 것을 확인할 수 있습니다.

 

3. 이중 포인터의 활용(2)

포인터 배열을 매개변수로 받는 함수에 매개변수 역할

2022.09.15 - [C언어] - C언어 - 포인터 배열(array of pointer)

 

C언어 - 포인터 배열(array of pointer)

안녕하세요 오늘은 포인터 배열에 대해 정리해보겠습니다. 아래 목차 순으로 알아보아요~ 1. 포인터 배열 선언 2. 포인터 배열 초기화 3. 포인터 배열과 2차원 배열 1. 포인터 배열 선언 아래 코드

leggo-fire.tistory.com

(포인터 배열 관련 포스팅을 참고하시면 더욱 이해가 쉬워집니다)

포인터 배열을 출력하는 함수의 매개변수로 이중 포인터를 활용했습니다. 

#include <stdio.h>

void print_array_of_pointer(char** pparr, int size){
    for(int i=0; i<size; i++){
        printf("%s\n",pparr[i]);
    }
    printf("\n");
    for(int i=0; i<size; i++){
        printf("%s\n",*(pparr + i));
    }
}

int main(){
    char* parr[] = {"hello","world","pointer"};
    int size = sizeof(parr) / sizeof(parr[0]);
    print_array_of_pointer(parr,size);

    return 0;
}

코드 해설

1.size가 정해지는 원리

sizeof(parr) : 포인터 3개의 요소를 가진 배열의 크기 => 12byte

sizeof(parr[0]) : hello를 가리키는 포인터 변수의 크기 => 4byte

따라서 size는 3 => 포인터 배열의 요소가 3개임을 알 수 있습니다. 

 

2. pparr이란?

pparr은 parr (&parr[0]) 즉, hello를 가리키는 포인터 변수의 주소 값입니다.

 

3. pparr 이중 포인터를 통해 parr 포인터 배열을 출력하는 방법

pparr를 배열 표현을 이용해 parr 포인터 배열을 출력합니다. 

pparr를 포인터 표현을 이용해 parr 포인터 배열을 출력합니다. 

 

오늘은 이중 포인터와 이중 포인터의 활용 방법에 대해 정리해보았습니다. 

포인터 & 배열 언제나 헷갈리는 부분입니다. 이번 포스팅을 통해 조금이나마 도움이 되었으면 좋겠네요

좋은 하루 보내세요~

Comments