- 앰퍼샌드(&)
더보기
1. 주소 연산자
&는 변수의 메모리 주소를 가져오는 연산자로 &num으로 num이 저장된 메모리 주소를 가져올 수 있다.
int main()
{
int num = 10;
//num의 값: num -> 10)
//num의 주소: &num -> 0x7ffe~~
}
2. 참조 연산자
참조(Reference)는 변수의 별명을 만드는 기능이다.
참조는 한 번 참조를 하게 되면 바꿀 수 없어 다른 변수를 참조할 수 없다. NULL을 가질 수 없어 항상 유효한 변수를 참조해야하며 기존 변수를 가리킬 뿐 새로운 공간을 만들지 않아 참조한 원본의 메모리 주소와 같다는 특징이 있다.
int main()
{
int a = 5;
int& ref = a; // a의 참조(별명)
ref = 10; // ref를 수정하면 a도 바뀜
//a의 값: 10
//ref의 값: 10
}
ref는 a의 별명이므로 ref의 값을 수정하면 a 또한 바뀐다.
- 포인터(*)
더보기
int num = 10;
int* ptr = #
포인터는 변수의 주소를 저장하는 변수이다. int* 은 포인터 변수를 나타내는 자료형으로 ptr은 num의 주소를 저장하는 변수이다.
int main()
{
int num = 10;
int* ptr = #
//num의 값: num -> 10
//num의 주소: &num -> 0x7ffe~~
//ptr이 저장한 주소: ptr -> 0x7ffe~~
}
포인터는 역참조의 기능으로도 사용할 수 있다. 역참조를 사용하면 포인터가 가리키는 실제 값을 가져올 때 사용된다.
int main() {
int num = 42;
int* ptr = # // num의 주소 저장
//*ptr의 값: *ptr -> 42
*ptr = 100; // 포인터를 이용해 num 값을 변경
//num의 새로운 값: num -> 100
}
*ptr을 이용해서 num의 값을 변경할 수 있다.
- 앰퍼샌드와 포인터
더보기
개념 | 설명 | 사용 예 |
&(주소 연산자) | 변수의 주소를 가져옴 | &num |
&(참조 연산자) | 변수의 별명을 만듦 | int& ref = num; |
*(포인터 선언) | 주소를 저장하는 포인터 선언 | int* ptr = # |
*(포인터 역참조) | 포인터가 가리키는 값에 접 | *ptr = 20; |
정리하자면 &는 주소를 가져오는 것이며 *은 그 주소가 가리키는 값을 가져오는 것이다.
포인터는 주소를 저장하고 기리키는 값을 변경할 수 있지만 참조는 변수의 별명으로 동작하여 값의 변경은 가능하지만 주소는 변경할 수 없다는 차이가 있다.
int num = 10;
int* ptr = #
연산자 | 의미 |
&num | num의 주소를 가져옴 |
ptr | num의 주소를 저장한 포인터 |
*ptr | ptr이 가리키는 값(= num의 값)을 가져옴 |
예시 코드
void changePointer(int* ptr)
{
*ptr = 50; // 포인터가 가리키는 변수의 값을 변경
}
void changeReference(int& ref)
{
ref = 100; // 참조 변수의 값을 변경
}
int main()
{
int num1 = 10;
int num2 = 20;
changePointer(&num1); // 포인터를 사용한 값 변경
changeReference(num2); // 참조를 사용한 값 변경
//num1 (포인터 변경) -> 50
//num2 (참조 변경) -> 100
}