나의 IT일지
포인터 연산 본문
포인터란 변수의 주소를 저장하는 공간이다. 즉, 포인터는 변수의 주소를 저장하는 것 뿐이지, 저장하는 값이 변할 수 있는 변수라는 것이다. 그래서 포인터도 연산이 가능하다.
포인터 연산
주소는 정수같아 보이지만 자료형에 대한 정보를 가지고 있는 특별한 값이기 때문에, 자유롭게 할 수 없고 정해진 연산만 가능하다. 포인터의 연산은 더하거나 빼기만 가능하며, 두 개의 포인터를 더할 수 없다. 즉, 곱셈,나눗셈은 불가능 하며, 서로 다른 포인터를 더할 수는 없다. (포인터명을 ptr로 한다.)
연산 가능 | 연산 불가능 |
ptr = ptr + 1 ptr = ptr + 2 ptr++ ++ptr ptr-- --ptr |
ptr = ptr*2 ptr = ptr/2 ptr = ptr1+ptr2 |
#include<stdio.h>
void main(){
int* p1 = 1000;
int* p2 = 1000;
printf("[연산전]p1:%d,p2:%d\n", p1, p2);
p1++;
p2--;
printf("[연산후]p1:%d,p2:%d\n", p1, p2);
}
위의 출력결과를 보면, 연산 후의 값의 증감량이 1이 아닌 4인것을 볼 수 있는데, 이는 포인터의 증감은 포인터가 저장한 변수의 자료형 크기만큼 증감한다는 것을 알 수 있다. 왜 그런것일까? 포인터는 변수라고 하더라도 주소를 저장하는 변수이다. 그래서 포인터의 증감은 주소의 증감을 뜻한다. 즉, 포인터의 증감은 해당 변수의 데이터량만큼 증감하여 다른 변수의 주소 혹은 변수가 올 수 있는 주소를 구하는 것이다.
#include<stdio.h>
void main() {
int* pi = 1000;
float* pf = 1000;
double* pd = 1000;
char* pc = 1000;
pi++;
pf++;
pd++;
pc++;
printf("pi:%d,pf:%d,pd:%d,pc:%d", pi, pf, pd, pc);
}
위의 코드를 보면, 정수형 int는 4만큼, 실수형float는 4만큼, 실수형double은 8만큼, 문자형char은 1만큼 증가하는 것을 알 수 있다. 이는 int형과 float형의 크기는 4byte, double형의 크기는 8byte, char형의 크기는 1byte라는 것을 알 수 있다.
번외) 혼동하기 쉬운 연산자들
포인터도 변수처럼 증감식을 만들 수 있다. 그렇다면 "*ptr++", "(*ptr)++"같은 경우에는 어떻게 처리가 되는 것일까?
#include<stdio.h>
void main() {
int x = 100;
int* px = &x;
printf("x:%d\n", x);
printf("px:%p\n", px);
printf("*px:%d\n", *px);
printf("&a:%p\n", &x);
printf("\n");
px++;
printf("x:%d\n", x);
printf("px:%d\n", px);
printf("*px:%d\n", *px);
printf("&a:%d\n", &x);
printf("\n");
px = &x;
printf("x:%d\n", x);
printf("px:%d\n", px);
printf("*px:%d\n", *px);
printf("*px++:%d\n", *px++);
printf("*px:%d\n", *px);
printf("\n");
px = &x;
(*px)++;
printf("x:%d\n", x);
printf("px:%d\n", px);
printf("*px:%d\n", *px);
printf("&a:%d\n", &x);
printf("\n");
}
위의 결과는 차례대로 "px++", "*px++", "(*px)++"의 출력값과 기존의 값을 비교하는 코드의 결과이다. "printf("*px++:%d\n", *px++);"의 결과값을 보면 변수 x의 값이 출력이 되고 그 뒤의 "printf("*px:%d\n", *px);"의 값이 쓰레기 값으로 변한 것을 볼 수 있다. 즉, "*px++"은 *px값인 변수x의 값을 먼저 출력한 후, px++를 진행한 것을 알 수 있다. "(*px)++"은 포인터 px의 값이 변화 하지 않고 변수 x값이 1 증가한것을 볼 수 있다. 이는 "(*px)++"는 포인터에 저장된 주소의 변수의 값을 1증가시킨다는 뜻을 알 수 있다.