// education

포인터(Pointer)의 개념과 메모리 주소

**포인터(Pointer)**는 일반적인 값(숫자, 문자)이 아니라, 다른 변수가 위치한 "메모리의 주소(Memory Address)"를 값으로 저장하는 변수입니다.


1. 포인터 관련 핵심 연산자 2가지

  1. 주소 연산자 (&): 변수 이름 앞에 붙여 해당 변수의 메모리 시작 주소를 알아냅니다.
  2. 역참조(간접 참조) 연산자 (*): 포인터 변수 앞에 붙여 그 주소가 가리키는 곳에 직접 찾아가 실제 값을 읽거나 수정합니다.

2. 포인터 선언과 동작 예시

#include <stdio.h>

int main(void) {
    int num = 10;
    int *p = &num; // p는 num의 메모리 주소를 가리키는 포인터 변수

    printf("num의 값: %d\n", num);      // 10
    printf("num의 주소: %p\n", &num);   // 메모리 주소 (예: 0x7ffd...)
    printf("p가 가진 주소: %p\n", p);   // &num과 동일한 주소
    printf("p가 가리키는 값: %d\n", *p); // 10 (역참조)

    *p = 50; // p가 가리키는 공간(num)의 값을 50으로 직접 변경!
    printf("수정 후 num: %d\n", num);   // 50으로 변경됨
    return 0;
}

3. Call by Value vs Call by Reference (값 전달 vs 주소 전달)

함수에 변수 값을 그냥 넘겨주면 복사본이 전달되지만, 포인터(주소)를 넘겨주면 함수 안에서 원본 변수의 값을 직접 바꿀 수 있습니다.

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

4. 자주 묻는 질문 (Q&A)

Q. 포인터 변수의 크기는 무조건 4바이트인가요 8바이트인가요? A. 포인터 변수의 크기는 가리키는 자료형(int*, char* 등)과 상관없이 운영체제 시스템 비트수에 따라 결정됩니다. 32-bit 시스템에서는 4 Bytes, 64-bit 시스템에서는 8 Bytes가 됩니다.

← 이전1차원 및 다차원 배열 (Array) 다음 →문자열 다루기 (문자 배열과 string.h 함수)