Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 IT일지

포인터 연산 본문

프로그래밍 언어/C언어

포인터 연산

세레프 2023. 2. 19. 05:37

 포인터란 변수의 주소를 저장하는 공간이다. 즉, 포인터는 변수의 주소를 저장하는 것 뿐이지, 저장하는 값이 변할 수 있는 변수라는 것이다. 그래서 포인터도 연산이 가능하다. 

 

 포인터 연산

 주소는 정수같아 보이지만 자료형에 대한 정보를 가지고 있는 특별한 값이기 때문에, 자유롭게 할 수 없고 정해진 연산만 가능하다. 포인터의 연산은 더하거나 빼기만 가능하며, 두 개의 포인터를 더할 수 없다. 즉, 곱셈,나눗셈은 불가능 하며, 서로 다른 포인터를 더할 수는 없다. (포인터명을 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증가시킨다는 뜻을 알 수 있다.

'프로그래밍 언어 > C언어' 카테고리의 다른 글

함수와 포인터  (0) 2023.02.22
배열과 포인터  (0) 2023.02.21
포인터의 기본  (0) 2023.02.18
다차원 배열  (0) 2023.02.17
배열  (0) 2023.02.16
Comments