ukk1211
1k
2020-01-17 20:09:38
2
199

주소연산자 &질문입니다.


int a=10;

int &b = a;  

위와 같이 되면 a,b 주소값은 같고 a, b 중 어느 값이 변하면 모두 값은 값으로 변합니다.


int *p = &a;

위와 같은 경우 p는 int *형 이므로 int 형 주소값을 담기에 a의 주소값을 나타내는 &를 대입한다고 논리적으로 이해되었는데 


int &b = a;  

이와 같은 경우는 b는 int & 형이므로 int형 주소 연산자 &를 담기에 주소값이 아닌 int 형 변수 a가 대입되는지 이해가 안됩니다.

int &b = &a; 가 논리적으로 맞지 않나 싶습니다.

int &b = a;  를 하게되면 컴퓨터 내부적으로 어떤 작용을 하길래 a,b가 같은 주소값을 가지고 같이 변하는지 알려주시면 감사하겠습니다.

ex) int *p = &a;는 *포인터 형이므로 p는 주소값을 담으므로 a의 주소값 &a를 담고 p는 a를 가르키다.

0
  • 답변 2

  • 니르바나
    2k
    2020-01-17 21:01:59

    위처럼 쓰나요?

    https://stackoverflow.com/questions/53035475/address-of-operator-and-l-values-in-c

    세가지 이유때문에 그렇게 쓰지말라네요.

  • esrse
    1k
    2020-01-17 21:27:01 작성 2020-01-17 21:28:01 수정됨

    컴퓨터로 이해하시려면 CPU와 RAM을 머리속에 떠올려 보세요.

    &나 * 는 그냥 C++ 언어에서 제공되는 추상적인 개념일 뿐입니다.

    CPU와 RAM은 &, * 에 대해서는 몰라요.



    C++ 언어의 reference 라는 개념은 원래의 변수를 가리키는 alias 입니다.

    그래서 int& b = a; 라고 하면 b가 a의 alias인 셈이죠.

    변수는 RAM 상에 특정 위치라고 볼 수 있습니다.

    a = 3; 이러면 RAM에 a라는 위치에 3을 저장하는 거죠.

    b = 4; 이러면 RAM에 b라는 위치에 4을 저장하는거죠. 그런데 여기서 b위치는 a위치랑 동일합니다.


    그리고 포인터에 대해서 말해볼게요.

    int a;

    int *b;

    b = &a; 라고 하면 a의 위치를 나타내는 address를 RAM에 b라는 위치에 담는 겁니다.

    a = 3; 이러면 RAM에 a라는 위치에 3을 저장했고요.

    *b; 이러면 b 위치에 저장돼 있는 address를 찾아가서 거기에 저장된 값을 읽어라는 거니까 결국 a 위치에서 3이 읽히는 거죠.


    ps. 제가 설명을 쉽게 하기 위해서 RAM을 말씀드렸지만, 실제로는 RAM주소를 직접 접근하진 않고, 운영체제가 제공하는 가상주소공간 내에 있는 주소로 접근해요.

  • 로그인을 하시면 답변을 등록할 수 있습니다.