포인터와 이중포인터

SIMWOOHYUN·2025년 3월 28일
post-thumbnail

포인터 기본 개념

포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다.
포인터 변수를 선언할 때는 데이터 타입 뒤에 * 기호를 붙여 선언하며, 예를 들어 int *ptr;는 정수형 변수의 주소를 저장하기 위한 포인터입니다.

주요 연산자

  • 주소 연산자(&): 변수의 메모리 주소를 반환합니다.

  • 역참조 연산자(*): 포인터가 가리키는 주소의 값을 읽어옵니다.

#include <stdio.h>

int main() {
    int value = 10;         // 일반 변수 선언
    int *ptr = &value;      // 포인터 선언 및 초기화

    printf("value: %d\n", value);                   // 일반 변수 출력
    printf("Address of value: %p\n", (void*)&value);  // 변수의 주소 출력
    printf("Value via pointer: %d\n", *ptr);          // 포인터를 통한 값 출력

    return 0;
}

포인터 활용 예제

포인터를 사용하면 다음과 같은 작업을 수행할 수 있습니다:

  • 배열 접근: 배열의 이름은 첫 번째 요소의 주소를 나타내므로 포인터 연산을 통해 배열 요소에 접근할 수 있습니다.

  • 함수 인자로서의 사용: 변수의 주소를 전달하여 함수 내부에서 값을 변경할 수 있습니다.

  • 동적 메모리 할당: malloc(), free() 등을 통한 메모리 할당 및 해제에 활용됩니다.

값 교환(swap) 함수 예제

#include <stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    printf("Before swap: x = %d, y = %d\n", x, y);
    swap(&x, &y);   // 주소를 함수에 전달
    printf("After swap: x = %d, y = %d\n", x, y);
    return 0;
}

이중 포인터 (Double Pointers)

이중 포인터는 포인터의 주소를 저장하는 포인터로, 즉 포인터를 가리키는 포인터입니다.
이중 포인터는 여러 단계의 간접 참조를 가능하게 하며, 주로 동적 메모리 할당 함수(예: getline())의 출력 매개변수 등에서 사용됩니다

#include <stdio.h>

int main() {
    int num = 100;
    int *ptr = &num;
    int **dptr = &ptr;

    printf("Value of num: %d\n", num);
    printf("Value via single pointer: %d\n", *ptr);
    printf("Value via double pointer: %d\n", **dptr);

    return 0;
}

메모리 구조 예시

[메모리 주소]
0x1000: num = 10      ←─┐
0x2000: ptr = 0x1000  ←─┼─┐
0x3000: dptr = 0x2000     |

0개의 댓글