포인터(pointer)는 다른 변수의 메모리 주소를 저장하는 변수입니다. 일반 변수가 값을 직접 저장한다면, 포인터는 값이 저장된 메모리상의 위치(주소)를 가리키는 역할을 합니다.
C 언어에서 포인터의 기본 문법은 다음과 같습니다.
pointer = &variable;
여기서 &(앰퍼샌드)는 변수의 주소를 얻는 주소 연산자이며, 포인터 앞에 붙는 *(별표)는 해당 주소에 저장된 실제 값을 참조하는 역참조 연산자입니다.
예제 코드
다음은 C 언어를 사용하여 포인터의 개념을 설명하는 프로그램입니다.
#include<stdio.h>
void main(){
//변수와 포인터 선언//
int a=2;
int *p;
//변수와 포인터 간의 관계 설정//
p=&a;
//필요한 예제 문장 출력//
printf("Size of the integer is %d\n",sizeof (int));//4//
printf("Address of %d is %d\n",a,p);//주소값//
printf("Value of %d is %d\n",a,*p);//2//
printf("Value of next address location of %d is %d\n",a,*(p+1));//(p+1) 주소의 쓰레기값//
printf("Address of next address location of %d is %d\n",a,(p+1));//주소값 +4//
//포인터 타입 캐스팅//
//문자형 데이터 타입 초기화 및 선언//
//a=2 = 00000000 00000000 00000000 00000010//
char *p0;
p0=(char*)p;
//필요한 문장 출력//
printf("Size of the character is %d\n",sizeof(char));//1//
printf("Address of %d is %d\n",a,p0);//주소값(p)//
printf("Value of %d is %d\n",a,*p0);//a 값의 첫 번째 바이트 - 2//
printf("Value of next address location of %d is %d\n",a,*(p0+1));//a 값의 두 번째 바이트 - 0//
printf("Address of next address location of %d is %d\n",a,(p0+1));//주소값(p)+1//
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Size of the integer is 4 Address of 2 is 6422028 Value of 2 is 2 Value of next address location of 2 is 463824 Address of next address location of 2 is 6422032 Size of the character is 1 Address of 2 is 6422028 Value of 2 is 2 Value of next address location of 2 is 0 Address of next address location of 2 is 6422029
결과 분석
정수형(int) 포인터의 경우
정수형 포인터 p는 변수 a의 주소인 6422028을 저장하고 있습니다. 정수형은 크기가 4바이트이므로, 다음 주소 위치인 p+1은 6422032로 4만큼 증가합니다. 또한 *(p+1)은 인접한 메모리 공간에 저장된 의미 없는 값(쓰레기값)을 참조하게 됩니다.
문자형(char) 포인터의 경우
포인터를 문자형으로 타입 캐스팅하면(p0=(char*)p), 포인터가 가리키는 단위가 1바이트로 변경됩니다. 따라서 p0+1은 주소가 1만큼만 증가하여 6422029가 되며, 정수 값 2를 구성하는 개별 바이트(첫 번째 바이트: 2, 두 번째 바이트: 0)를 하나씩 읽을 수 있습니다.
이처럼 포인터의 자료형에 따라 주소 연산 시 이동하는 바이트 크기가 달라지며, 이는 C 언어에서 메모리를 세밀하게 제어할 수 있는 핵심 개념입니다.