참조 연산자
참조 연산자는 변수가 사용하는 메모리의 주소값을 나타내는 연산자 입니다.
아래의 코드를 집적 작성하고 실행해 봅시다.
#include <stdio.h> main () { int a = 3; printf ( "%d \n", &a); printf ( "%d %d \n", a, *&a); }
실행결과
위 프로그램을 실행하면 설정한 값이 저장되어 있는 주소를 출력합니다.
- 5행에서 ‘&’ 연산자는 변수 a가 저장된 메모리(RAM) 공간의 주소값을 알아냅니다.
- 6행에서 ‘*’연산자는 a의 메모리 주소에 지정된 값을 나타내는 연산자입니다. 또한 *a만 사용하게 되면 오류가 발생합니다.
&의 기능
& 가 두 개의 변수, 혹은 상수 사이에 위치하게 되면 알다시피 비트연산(AND) 기능을 합니다.
예시: int a = 3 & 4; // a에는 0이 들어갑니다.
예시: int a = 3 & 4; // a에는 0이 들어갑니다.
& 는 변수의 메모리 주소값을 이야기합니다.
*의 기능
* 가 두 개의 변수, 혹은 상수 사이에 위치하게 되면 알다시피 곱하기 기능을 합니다.
int a = 3 * 4; // a에는 12가 들어갑니다.
int a = 3 * 4; // a에는 12가 들어갑니다.
* 가 선언문에서 변수 타입 뒤에 붙으면 "포인터형 변수"를 선언한다는 뜻이 됩니다.
자세한 사항은 포인터 토픽에 나옵니다.
* 가 일반적인 구문에 오면서 두 개의 변수, 혹은 상수 사이에 위치하지 않는다면 이는 "역참조"를 뜻합니다. 즉 포인터형 변수가 가리키는 메모리 주소에 저장되어 있는 내용을 나타냅니다.
포인터
포인터 변수에는 메모리 주소가 저장되어 있습니다. 이때 메모리 주소가 있는 곳으로 이동해서 값을 가져오고 싶다면 역참조 연산자 *를 사용하여 가져와야 합니다. 위의 프로그램에서 a가 아닌 &a로 쓴 이유는 포인터와 마찬가지로 &a는 주소를 나타내므로 *를 사용하여 값을 가져올 수 있습니다. (자세한 사항은 포인터 토픽에 나옵니다.)
참조 연산자의 쓰임
형 변환 연산자
형 변환 연산자는 자료형을 바꾸어 주기 위해 사용되는 연산자 입니다.
아래의 코드를 직접 작성하고 실행해 봅시다.
#include <stdio.h> main () { printf ( "%d \n", 4/3); printf ( "%f \n", 4/3); printf ( "%f \n", (float) 4/3); printf ( "%f \n", 4 / 3.0); }
실행결과
위 프로그램을 실행하면 같은 데이터에 대하여 각각 다른 형태의 연산 결과가 출력됩니다.
- 4행에서 4를 3으로 나눈 결과를 출력할때, 4와 3이 모두 정수형이므로 연산 결과도 정수형이 됩니다. 따라서 소수점 이하 부분이 절삭되어 1이 출력되죠.
- 5행에서도 같은 결과이지만, printf()함수의 출력 서식이 실수형(%f) 이므로 예상치 못한 결과가 나옵니다.
- 6행에서 ‘4/3’앞에 ‘(float)’라는 형 변환 연산자를 사용함으로서 연산 결과를 실수형으로 바꾸어 줍니다.
- 7행에서 4를 3이 아닌, 3.0으로 나누어 줌으로써 정수를 실수로 나누는 형태가 됩니다. 이 경우에는 특별히 형 변환을 지정하지 않아도 자동으로 실수형으로 변환되어 계산되는 것이죠.
- 위의 프로그램은4를 3으로 나눈 결과를 출력하는 프로그램으로 조금씩 다른 결과를 출력합니다. 이것은 서로 다른 데이터 형의 값들이 계산되는 과정에서 데이터 형이 변환되기 때문에 자동적으로 데이터 형이 변환되기도 하고, 강제적으로 데이터 형을 변환시킬 수도 있습니다.(예시: (double) 4/3, 3.0)
형(Type) : 변수와 상수들이 취할값과 그것에 가해질수 있는 연산을 결정합니다.
연산자 우선순위
우리가 수학 계산식에서 먼저 계산을 수행하는 우선순위가 있듯이, C프로그래밍에서도 여러가지 연산자가 복합적으로 사용될 때 연산자 우선순위가 있습니다.
우선순위가 높을수록 먼저 계산되고, 같은 순위의 연산자가 여러개 사용된 경우 결합순서에 의해 계산 순서가 결정 됩니다.
우선순위
다음 토픽에서는 우리가 지금까지 배운 연산자를 가지고 코드업에서 문제를 풀어봅시다.