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

C 언어 포인터 산술 연산 완벽 가이드 – 선언, 초기화부터 실전 예제까지

포인터(pointer)는 다른 변수의 메모리 주소를 저장하는 특수한 변수입니다. C 언어에서 포인터는 메모리를 직접 다룰 수 있게 해주는 강력한 도구로, 배열·문자열 처리나 함수 간 데이터 전달 등에 폭넓게 활용됩니다.

포인터의 선언, 초기화 및 접근

먼저 다음 문장을 살펴보겠습니다.

int qty = 179;

C 언어 포인터 산술 연산 완벽 가이드 – 선언, 초기화부터 실전 예제까지

포인터 선언하기

int *p;

'p'는 다른 정수형(int) 변수의 주소를 저장하는 포인터 변수입니다.

포인터 초기화하기

포인터 변수는 주소 연산자(&)를 사용해 초기화합니다. 주소 연산자는 해당 변수가 메모리에 위치한 주소값을 반환합니다.

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

C 언어 포인터 산술 연산 완벽 가이드 – 선언, 초기화부터 실전 예제까지

포인터를 이용한 산술 연산

포인터 변수도 일반 변수처럼 수식에 사용할 수 있습니다. 포인터 변수가 올바르게 선언되고 초기화되었다면 아래 문장들은 모두 유효합니다.

a) *p1 + *p2
b) *p1 - *p2
c) *p1 * *p2
d) *p1 / *p2   ※ '/'와 '*' 사이에는 반드시 공백이 있어야 합니다.
                 그렇지 않으면 주석(comment)의 시작으로 해석됩니다.
e) p1 + 4
f) p2 - 2
g) p1 - p2     ※ p1과 p2가 같은 배열을 가리킬 때,
                 두 포인터 사이의 요소 개수를 반환합니다.
h) p1++
i) --p2
j) sum += *p2
k) p1 > p2
l) p1 == p2
m) p1 != p2    ※ 비교 연산은 배열과 문자열 처리 시
                 의미 있게 활용됩니다.

반면, 다음 문장들은 유효하지 않습니다.

a) p1 + p2
b) p1 * p2
c) p1 / p2
d) p1 / 3

포인터끼리의 덧셈, 곱셈, 나눗셈은 허용되지 않습니다. 역참조된 값(*p1, *p2)끼리의 연산은 가능하지만, 주소값 자체를 대상으로 한 산술 연산은 의미가 없거나 위험할 수 있기 때문입니다. 단, 같은 배열 안에서의 포인터 뺄셈(p1 - p2)은 두 요소 사이의 거리를 구하는 용도로만 예외적으로 허용됩니다.

예제 프로그램

#include<stdio.h>
main (){
    int a,b,x,y,z;
    int *p1, *p2;
    a =12;
    b = 4;
    p1= &a;
    p2 = &b;
    x = *p1 * * p2 – 6;
    y= 4 - *p2 / *p1+10;
    printf (“Address of a = %d”, p1);
    printf (“Address of b = %d”, p2);
    printf (“a= %d b =%d”, a,b);
    printf (“x= %d y =%d”, x,y);
}

실행 결과

Address of a = 1234
Address of b = 5678
a = 12 b= 4
x = 42 y= 14

코드 설명

p1은 변수 a의 주소를, p2는 변수 b의 주소를 저장합니다. 따라서 *p1은 a의 값(12), *p2는 b의 값(4)이 됩니다.

  • x = *p1 * *p2 - 6 → 12 × 4 − 6 = 42
  • y = 4 - *p2 / *p1 + 10 → 4 − (4 ÷ 12) + 10 = 4 − 0 + 10 = 14 (정수 나눗셈이므로 소수점 이하 버림)

출력된 주소 값(1234, 5678)은 예시일 뿐이며, 실제 값은 실행 환경과 시스템에 따라 달라집니다.

C 언어 포인터 산술 연산 완벽 가이드 – 선언, 초기화부터 실전 예제까지