C++ 메모장

앰퍼샌드(&)와 포인터(*)

lgbl 2025. 2. 6. 10:10
  • 앰퍼샌드(&)
더보기

    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
}

 

'C++ 메모장' 카테고리의 다른 글

std::find  (0) 2025.02.20
npos  (0) 2025.02.19
INT_MAX  (0) 2025.02.17
람다 표현식  (0) 2025.02.12
정규 표현식(Regex)  (1) 2025.02.05