포인터와 참조자에 관한 고찰 in C++
참조자를 처음 공부할때 든 생각이 이거 참조자가 할 수 있는 일중에 포인터가 못하는게 있나? 였다.
하지만 처음 C언어를 공부할때 포인터를 보면서 이거 왜 배우는거지? 하다가 진도를 나가보니 포인터가 C언어의 꽃임을 알게되었기에 참조자를 공부하고도 점점 쓰다보면 알게 되겠지라고 넘겼다.
하지만 봐도봐도 포인터가 존재하는데 왜 굳이 참조자를 만든지 모르겠다.
다행히 나만이 아니라 대부분의 사람들의 의문이었던건지 한글로 검색해도 많은 정보를 얻을 수 있었다.
차이점
1. NULL 허용 여부
- 포인터는 NULL을 허용하지만 레퍼런스는 NULL을 허용하지 않는다.
struct person
{
int birthday;
};
struct person *peter = NULL;
peter->birthday = 1220;
위와 같이 코드를 짜면 에러가 발생하지만 실행이 된다! (컴파일에러 발생안함)
struct person
{
int birthday;
};
struct person &peter = NULL;
peter.birthday = 1220;
하지만 이렇게 코드를 짜면 컴파일에러를 내며 reference가 initialized 되지 않았다고 알려준다.
2. 참조 대상 할당 및 접근
- 포인터는 &연산을 통해 주소값을 할당한다.
- 레퍼런스는 참조 대상을 그대로 할당한다.
따라서 레퍼런스에는 NULL을 할당할 수 없다.
- 함수 호출에서도 포인터는 주소값을 입력해야하고 참조자는 변수를 그대로 입력하면 된다.
struct person peter;
isBirthdayByPointer(&peter);
isBirthdayByReference(peter);
3. 값을 참조할때 연산자사용
- 포인터는 참조를 사용할때 *, ->등 포인터 연산자를 사용해야한다.
- 레퍼런스는 일반변수처럼 접근할 수 있다. (레퍼런스를 변경하면 레퍼런스가 참조하고 잇는 실제 변수의 값이 변경된다)
4. call by address
- 포인터는 주소를 가리킨다. 이에 덧셈뺄셈으로 다른 주소에도 자유롭게 접근이 가능하다.
- 이는 포인터를 통해 할당되지 않은 메모리 공간 또는 다른 메모리 공간에 접근할 수 있다는 의미이다.
결론
레퍼런스는 포인터를 위험하게 사용하는 경우를 막고자 생겨났다.
레퍼런스는 포인터와 달리 여러 제약 사항이 존재한다.
Use references when you can, and pointers when you have to
사용할 수 있다면 참조자를, 어쩔 수 없다면 포인터를 써라
C++ FAQ
지금 당장은 가리키는 대상을 바꿔야 할 때 (Call by address) 외에는 포인터를 써야한다고 생각이 드는 부분이 없다.
가능하면 참조자를 쓰려고 노력하자
출처:
https://woo-dev.tistory.com/43
[C++] 포인터와 레퍼런스(참조)의 차이를 이해해보자
C++에는 포인터(Pointer)와 레퍼런스(Reference)라는 개념이 있다. 포인터는 C 에도 있었던 개념이며 레퍼런스는 C++ 에서 등장한 개념이다. 언뜻 보면 용도가 비슷한데 정확히 어떤 차이점이 있는지,
woo-dev.tistory.com
https://gracefulprograming.tistory.com/11
[C++] 포인터(Pointer)와 레퍼런스(Reference : 참조자)의 차이
안녕하세요 피터입니다. 오늘은 C언어를 배운 후 C++을 공부하는데 있어서 굉장히 헷갈리는 개념인 포인터와 레퍼런스의 차이에 대해서 설명드리겠습니다. 개요 C++ 프로그래밍을 시작하면 레퍼
gracefulprograming.tistory.com