본문 바로가기
공부/C언어

[C언어] 포인터의 이해

by 현구원 2025. 5. 8.
반응형

 C언어에서 포인터(pointer)는 어려운 개념 중 하나입니다. 하지만 포인터를 정확히 이해하면 메모리 구조, 함수 인자 전달, 동적 메모리 할당 등 핵심 개념을 더 쉽게 받아들일 수 있습니다.

 이번 글에서는 포인터 중에서도 **"포인터 변수"**를 중심으로 기초적인 개념부터 주의할 점까지 쉽고 간단하게 정리해보겠습니다.


포인터란?

포인터는 말 그대로 **'주소값을 저장하는 변수'**입니다. 즉, 다른 변수의 메모리 주소를 저장하는 역할을 합니다.


int num = 10;
int* pnum = #
  • num: 일반 변수 (값을 저장)
  • pnum: 포인터 변수 (주소값을 저장)

위 코드에서 pnum은 num의 주소를 저장하고 있는 포인터 변수입니다.


포인터 변수 선언 방법

포인터는 아래와 같은 형태로 선언합니다.

type *ptr;

 

예시:

int *ptr; // int형 변수를 가리키는 포인터

char *cptr; // char형 변수를 가리키는 포인터

 

💡 type은 포인터가 어떤 자료형의 데이터를 가리킬 것인지를 알려줍니다.


&와 * 연산자의 의미

  • &변수 : 변수의 주소값을 구함
  • *포인터 : 포인터가 가리키는 실제 값을 구함
 
int num = 5;
int *ptr = #
 
printf("%d", ptr); // num의 주소가 출력
printf("%d", *ptr); // num의 값이 출력 (5)

초기화되지 않은 포인터는 위험하다

int *ptr;

 

 이렇게 선언만 하고 초기화하지 않은 포인터는 ‘쓰레기 값’을 가리키게 됩니다. 즉, 어떤 메모리 영역을 참조할지 알 수 없기 때문에 프로그램 오류나 시스템에 치명적인 영향을 줄 수 있습니다.

안전하게 초기화하는 방법

int *ptr1 = 0; // 또는
int *ptr2 = NULL;

 

NULL은 어떤 변수도 가리키지 않는다는 의미로, 의도적으로 포인터를 초기화하지 않은 상태로 두고 싶을 때 사용합니다.


요약

포인터란? 변수의 주소값을 저장하는 변수
선언 방법 type *ptr;
주소 참조 &변수 → 주소값 획득
값 참조 *포인터 → 값 획득
초기화 필수 쓰레기 값을 방지하려면 NULL 또는 0으로 초기화

예제

문제1

 int형 변수 num1과 num2를 선언과 동시에 각각 10과 20으로 초기화하고, int형 포인터 변수 ptr1과 ptr2를 선언하여 각각 num1과 num2를 가리키게 하자. 그리고 이 상태에서 포인터 변수 ptr1과 ptr2를 이요해서 num1의 값을 10 증가시키고, num2의 값을 10 감소시키자.

 이제 두 포인터 변수 ptr1과 ptr2가 가리키는 대상을 서로 바꾸자. 즉, 포인터 변수 ptr1이 num2를 가리키게 하고, 포인터 변수 ptr2가 num1을 가리키게 하자. 그리고 마지막으로 ptr1과 ptr2가 가리키는 변수에 저장된 값을 출력하자.

예제 답


마무리하며

 C언어의 포인터는 어렵지만, 기본 원리만 명확히 이해하면 다양한 활용이 가능합니다. 특히, 포인터 변수의 선언과 초기화, &와 * 연산자의 의미만 제대로 익혀두면 포인터 관련 코드는 한결 편해질 것입니다.

반응형