C언어 초급 - 10장: 포인터 (10.1 포인터의 개념)

2025. 2. 24. 11:40프로그래밍 언어/C

10.1 포인터의 개념

1. 포인터(Pointer)란?

포인터(Pointer)변수의 메모리 주소를 저장하는 변수입니다.
즉, 변수 자체의 값이 아니라, 변수의 주소를 가리키는 변수입니다.

📌 포인터의 역할

  • 변수의 메모리 주소를 저장하고 조작할 수 있음.
  • 동적 메모리 할당(Heap Memory)에서 필수적으로 사용됨.
  • 배열, 함수, 구조체 등과 함께 활용 가능.

2. 변수와 메모리 주소

2.1 변수와 메모리 저장 방식

모든 변수는 메모리의 특정 주소(Address) 에 저장됩니다.

#include <stdio.h>

int main() {
    int num = 10;
    
    printf("변수 num의 값: %d\n", num);
    printf("변수 num의 메모리 주소: %p\n", &num);

    return 0;
}

출력 예시

변수 num의 값: 10
변수 num의 메모리 주소: 0x7ffee3b3d9c0  (메모리 주소는 실행할 때마다 다름)

📌 설명

  • num의 값은 10이지만, 실제 메모리에서 저장된 위치는 &num을 통해 확인할 수 있음.
  • %p 서식 지정자를 사용하여 포인터(주소)를 출력.

3. 주소 연산자(&)와 포인터 연산자(*)

C 언어에서 포인터를 사용하려면 &(주소 연산자)와 *(포인터 연산자)를 이해해야 함.

3.1 주소 연산자(&)

  • 변수의 메모리 주소를 반환함.

📌 예제 – 변수의 주소 확인

#include <stdio.h>

int main() {
    int num = 10;

    printf("변수 num의 값: %d\n", num);
    printf("변수 num의 주소: %p\n", &num);  // &num: 변수 num의 주소

    return 0;
}

출력 예시

변수 num의 값: 10
변수 num의 주소: 0x7ffee3b3d9c0

📌 설명

  • &num → 변수 num의 주소를 가져옴.

3.2 포인터 연산자(*)

  • 포인터 변수를 선언할 때 사용 → 주소를 저장하는 변수 선언.
  • 포인터 변수가 가리키는 주소의 값을 참조할 때 사용.

📌 예제 – 포인터 사용하기

#include <stdio.h>

int main() {
    int num = 10;
    int *ptr = &num;  // 포인터 선언 및 주소 저장

    printf("num의 값: %d\n", num);
    printf("포인터 ptr이 가리키는 값: %d\n", *ptr);
    printf("포인터 ptr이 저장하는 주소: %p\n", ptr);
    printf("num의 주소: %p\n", &num);

    return 0;
}

출력 예시

num의 값: 10
포인터 ptr이 가리키는 값: 10
포인터 ptr이 저장하는 주소: 0x7ffee3b3d9c0
num의 주소: 0x7ffee3b3d9c0

📌 설명

  • int *ptr = &num; → ptr이 num의 주소를 저장.
  • *ptr → ptr이 가리키는 변수 num의 값을 가져옴.

4. 포인터의 선언과 사용

4.1 포인터 변수 선언

자료형 *포인터이름;
  • 포인터 변수 선언 시 *을 사용하여 선언.
  • 포인터의 자료형은 가리키는 변수의 자료형과 같아야 함.
포인터 선언  설명
int *p; int 타입 변수를 가리키는 포인터
double *p; double 타입 변수를 가리키는 포인터
char *p; char 타입 변수를 가리키는 포인터

📌 포인터의 자료형은 가리키는 변수의 크기와 연산에 영향을 미침.
📌 포인터 변수를 선언할 때 반드시 초기화해야 함 (초기화하지 않으면 쓰레기 값 포함됨).


4.2 포인터를 활용한 변수 값 변경

포인터를 사용하면 변수 값을 간접적으로 변경할 수 있음.

#include <stdio.h>

int main() {
    int num = 10;
    int *ptr = &num;  // num의 주소를 포인터 ptr에 저장

    printf("num의 초기 값: %d\n", num);

    *ptr = 20;  // 포인터를 이용하여 num 값 변경

    printf("포인터 ptr을 이용하여 변경된 num 값: %d\n", num);

    return 0;
}

출력 결과

num의 초기 값: 10
포인터 ptr을 이용하여 변경된 num 값: 20

📌 설명

  • *ptr = 20; → ptr이 가리키는 메모리 주소의 값을 20으로 변경.
  • 따라서 num의 값도 20으로 바뀜.

5. 정리

개념 설명 예제
포인터(Pointer) 변수가 저장된 메모리 주소를 저장하는 변수 int *ptr;
주소 연산자(&) 변수의 메모리 주소를 반환 &num
포인터 연산자(*) 포인터가 가리키는 값에 접근 *ptr = 20;
포인터 선언 특정 자료형을 가리키는 포인터 선언 int *p;
포인터 초기화 특정 변수의 주소를 저장해야 함 int *p = &num;
포인터 값 변경 포인터를 사용하여 변수 값 변경 가능 *ptr = 30;

📌 포인터는 변수의 주소를 저장하는 변수!
📌 주소 연산자(&)를 사용하여 변수의 메모리 주소를 가져옴
📌 포인터 연산자(*)를 사용하여 포인터가 가리키는 값을 참조 또는 변경 가능