C언어 포인터 기초 완벽 정리: 선언, 연산, 함수와의 관계

C언어 포인터 기초 완벽 정리


C언어 포인터 기초부터 선언, 연산, 함수와의 관계까지 초보자도 이해할 수 있는 완벽 가이드. 다양한 예제 코드로 C언어 포인터 개념을 쉽게 배워보세요.


1. C언어 포인터란 무엇인가?

C언어 포인터는 변수의 ‘값’이 아닌 메모리 주소를 저장하는 변수입니다.
쉽게 말해, 일반 변수는 데이터를 담는 상자라면, 포인터는 **그 상자의 위치(주소)**를 기억하는 역할을 합니다.

👉 왜 포인터가 중요할까?

  • 배열, 문자열 처리의 핵심
  • 동적 메모리 할당에 필수
  • 함수 인자 전달 시 효율적인 메모리 관리 가능

2. C언어 포인터 선언과 사용법

포인터는 * 연산자를 사용해 선언합니다.

int a = 10;
int *p;     // int형 포인터 선언
p = &a;     // 변수 a의 주소를 p에 저장

printf("a의 값: %d\n", a);
printf("a의 주소: %p\n", &a);
printf("포인터 p가 가리키는 값: %d\n", *p);
  • &a → 변수 a의 주소
  • *p → 포인터가 가리키는 주소에 저장된 값

3. 포인터와 메모리 주소

C언어에서 모든 변수는 메모리에 저장됩니다.
포인터를 통해 메모리 주소를 직접 다룰 수 있기 때문에, 저수준 프로그래밍(예: 운영체제, 임베디드 시스템)에서 강력한 도구로 쓰입니다.

예를 들어, int는 보통 4바이트 크기를 차지합니다.
포인터를 이용하면 메모리 공간을 효율적으로 제어할 수 있습니다.


4. 포인터 연산

포인터는 단순히 주소를 저장할 뿐 아니라, 주소를 이동하는 연산도 가능합니다.

int arr[3] = {10, 20, 30};
int *p = arr;

printf("%d\n", *p);     // 10
printf("%d\n", *(p+1)); // 20
printf("%d\n", *(p+2)); // 30
  • p+1 은 배열의 다음 요소를 가리킴
  • 즉, 배열과 포인터는 깊은 관련성을 가짐

👉 배열 이름은 곧 첫 번째 요소를 가리키는 포인터와 동일한 역할을 합니다.


5. 포인터와 함수

포인터는 함수 호출 시 Call by Reference 효과를 낼 수 있습니다.

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main() {
    int a = 5, b = 10;
    swap(&a, &b);
    printf("a=%d, b=%d\n", a, b); // a=10, b=5
    return 0;
}
  • swap() 함수는 포인터를 사용해 원본 변수의 값을 교환
  • 일반적인 함수 호출(Call by Value)에서는 불가능한 작업

6. 이중 포인터 (Pointer to Pointer)

포인터의 주소를 저장하는 포인터를 이중 포인터라고 합니다.

int a = 100;
int *p = &a;
int **pp = &p;

printf("a=%d\n", **pp);  // 100

👉 다차원 배열, 동적 메모리 관리 시 활용


7. 동적 메모리 할당과 포인터

C언어에서 포인터는 malloc, free와 함께 메모리를 동적으로 할당할 때 반드시 사용됩니다.

int *p = (int*)malloc(sizeof(int) * 3);
p[0] = 1; p[1] = 2; p[2] = 3;

for(int i=0; i<3; i++) {
    printf("%d ", p[i]);
}
free(p); // 메모리 해제

👉 동적 메모리 할당은 배열 크기를 런타임에 결정할 때 유용합니다.


8. C언어 포인터 활용 예제

(1) 문자열 출력

char *str = "Hello, Pointer!";
printf("%s\n", str);

(2) 배열 탐색

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;

for(int i=0; i<5; i++) {
    printf("%d ", *(p+i));
}

9. 포인터 사용 시 주의사항

포인터는 강력하지만, 잘못 사용하면 오류의 원인이 됩니다.

✔ 초기화되지 않은 포인터(쓰레기 값 주소) 사용 금지
✔ 메모리 해제 후 다시 접근(댕글링 포인터) 금지
✔ 배열 범위를 벗어난 접근은 치명적 오류 발생


10. 정리 및 다음 학습 예고

오늘은 C언어 포인터 기초를 다루며 선언, 연산, 함수 활용까지 정리했습니다.
포인터는 C언어의 가장 중요한 문법 중 하나로, 배열·문자열·동적 메모리와 연결되며 고급 프로그래밍으로 가는 필수 개념입니다.

👉 이전 글 C언어 함수 완벽 가이드: 함수 정의, 선언, 매개변수와 반환값 이해하기

👉 다음 글에서는 C언어 배열과 포인터의 관계를 심층적으로 다뤄서, 문자열 처리와 다차원 배열에서 포인터가 어떻게 작동하는지 살펴보겠습니다.


🔑 핵심 요약

  • C언어 포인터는 메모리 주소를 저장하는 변수
  • 포인터 연산으로 배열 탐색 가능
  • 함수에서 포인터 사용 시 원본 변수 값 변경 가능
  • 이중 포인터는 다차원 배열, 동적 메모리 할당에 활용
  • 주의하지 않으면 댕글링 포인터, 메모리 누수 발생 가능

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다