소프트웨어/C 언어

[C언어]31. 메모리를 직접 관리하는, 포인터에 대하여 알아보자 ( 포인터의 연산 )

리습 2013. 9. 12. 17:01


 안녕하십니까. 리습입니다.


 포인터 변수 또한 변수이기 때문에 연산이 가능합니다. 하지만 포인터 변수는 '메모리 주소'를 저장하는 공간이기 때문에 일반적 변수와는 차이가 있죠. 필요하느냐, 그렇지 않느냐의 차이입니다. 하나씩 체크하면서 알아보도록 하겠습니다.


 포인터 변수와 포인터 변수 사이의 연산


 사칙연산 중 첫번째는 덧셈입니다. 포인터 변수 와 포인터 변수의 덧셈은 어떤 의미를 가지고 있을까요? 포인터 값끼리의 덧셈은 의미를 가지고 있지 않습니다. 단순한 주소와 주소의 덧셈이기때문에 사용이 될 일도 없습니다. 그래서 C언어에서는 포인터 변수끼리의 덧셈은 오류로 처리하고 있습니다. 


 두번째로 뺄셈입니다. 뺄셈은 덧셈과는 다르게 허용하고 있습니다. 포인터 변수값의 차 라는 것은 실 메모리에서 두 값의 거리 차이로 해석할 수 있기 때문입니다.  두 메모리 주소의 차이는 배열의 처리등에서 유용하기 쓰입니다. 

세번째로 곱셈과 나눗셈입니다. 덧셈과는 반대로 곱셈과 나눗셈은 사용 가능합니다. 하지만 의미가 없기 때문에 사용되지 않습니다. 몇몇 컴파일러는 오류로 처리하기도 하죠. 결론적으로 포인터 변수 사이의 연산은 뺄셈만 가능합니다. 


네번째로 비교 입니다. 포인터와 포인터 연산중 == 혹은 =!은 사용 가능합니다. 두 포인터가 같은 주소를 가르키고 있는가에대한 연산으로 작용합니다. 비교할시엔 타입이 같아야만 합니다. 


포인터 변수와 정수, 실수 사이의 연산 


 포인터 변수와 정수 사이의 연산은 모두 가능합니다. 포인터에 정수 덧셈, 뺄셈을 할경우 포인터 변수의 타입에 따라 주소값에 정수를 더하고 뺍니다. 곱셈과 나눗셈도 가능합니다만 의미가 없기 때문에 사용되지 않죠. 정수와의 연산은 모두 가능하기 때문에 ++ -- 등이 연산자도 사용이 가능합니다.


 포인터  변수와 실수 사이의 연산은 불가능합니다. 주소값에 0.5 와 같은 숫자를 더하거나 뺄순 없기 때문이죠. 



포인터도 변수이기 때문에 연산자를 통해 연산이 가능합니다. 하지만 포인터가 저장하는 메모리 주소값이라는 특수한 값때문에 모든 연산자를 사용할 수는 없습니다. 사용가능한 연산자와 방식을 잘 익혀서 포인터 변수도 일반 변수와 같이 편리하게 사용하시면 됩니다.