Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 포인터 완벽 이해: 개념부터 선언, 초기화, 접근까지


포인터란 무엇인가?

포인터(Pointer)는 다른 변수의 메모리 주소를 저장하는 변수입니다. C 언어에서 포인터는 메모리를 직접 제어할 수 있게 해주는 핵심 개념으로, 배열·문자열 처리와 함수 간 데이터 전달에 널리 활용됩니다.

포인터의 선언, 초기화 그리고 접근

먼저 다음과 같은 일반적인 변수 선언문을 살펴보겠습니다.

int qty = 179;

이 코드는 정수형 변수 qty에 179라는 값을 저장합니다. 이때 메모리상에는 qty의 값과 함께 그 값이 위치한 주소(address)가 존재합니다.

C 언어 포인터 완벽 이해: 개념부터 선언, 초기화, 접근까지

포인터 선언 방법

int *p;

위 문장에서 p다른 정수형(int) 변수의 주소를 저장하는 포인터 변수입니다. 자료형 뒤에 별표(*)를 붙이면 해당 자료형을 가리키는 포인터가 됩니다.

포인터 초기화 방법

포인터 변수는 주소 연산자(&)를 사용하여 초기화합니다. 주소 연산자는 변수 앞에 붙어 해당 변수의 메모리 주소를 반환합니다.

int qty = 175;
int *p;
p = &qty;

이제 p에는 변수 qty의 주소가 저장되며, 역참조 연산자(*)를 통해 *p로 qty의 값에 접근할 수 있습니다.

C 언어 포인터 완벽 이해: 개념부터 선언, 초기화, 접근까지

예제: 포인터로 문자 배열 요소 접근하기

포인터는 문자열 배열의 특정 위치에 있는 요소에 접근할 때 특히 유용합니다. 아래 프로그램은 포인터 연산을 통해 문자 배열의 특정 위치 값을 계산하고 출력하는 예제입니다.

핵심 동작 원리는 다음과 같습니다. 전위 증가(++*)된 두 포인터가 가리키는 문자값을 더한 뒤 32를 빼면, 해당 위치의 최종 값이 계산됩니다.

예제 코드

#include<stdio.h>
int main(){
    char s[] = {'a', 'b', 'c', '\n', 'c', '\0'};
    char *p, *str, *str1;
    p = &s[3];
    str = p;
    str1 = s;
    printf("%d", ++*p + ++*str1 - 32);
    return 0;
}

실행 결과

77

코드 상세 설명

p = &s[3];   → p는 '\n'의 주소를 가리킴 (ASCII 코드 10)
str = p;     → str 역시 p와 같은 주소를 가리킴
str1 = s;    → str1은 배열의 첫 번째 문자 'a'의 주소를 가리킴 (ASCII 코드 97)

printf("%d", ++*p + ++*str1 - 32);

① ++*p      → '\n'(10)이 전위 증가되어 12가 됨 ('\v'의 ASCII 코드)
② ++*str1   → 'a'(97)가 전위 증가되어 98이 됨 ('b'의 ASCII 코드)
③ 계산 과정 → printf("%d", 12 + 98 - 32);
            → printf("%d", 12 + 66);
            → printf("%d", 78);

주의: 위 계산을 단계별로 정리하면 ++*p는 10에서 12로 증가하고(개행 문자 \n의 ASCII 코드는 10이므로), ++*str1은 97에서 98로 증가합니다. 따라서 실제 결과는 12 + 98 - 32 = 78이 되지만, 원문 예제에서는 출력값이 77로 표시되어 있습니다. 이처럼 포인터의 전위 증가 연산은 값 자체를 변경한다는 점을 반드시 기억해야 하며, 컴파일러나 환경에 따라 결과가 달라질 수 있는 부분이므로 학습 시 직접 실행해 확인해보는 것이 좋습니다.

정리

C 언어의 포인터는 변수의 주소를 저장하여 메모리에 간접적으로 접근하는 강력한 도구입니다. 핵심을 요약하면 다음과 같습니다.

  • 선언: int *p; 형태로 자료형에 별표(*)를 붙여 선언
  • 초기화: 주소 연산자(&)로 변수의 주소를 할당 (p = &qty;)
  • 접근: 역참조 연산자(*)로 포인터가 가리키는 값 읽기/쓰기 (*p)
  • 전위 증가(++*p): 포인터가 가리키는 값 자체가 1 증가하므로 주의 필요