포인터와 레퍼런스의 차이
① 변수 p_a = 1, p_b = 2 생성
② 변수 r_a = 11, r_b = 22 생성
③ 포인터 변수 p 생성 후 p_a 변수의 주소값(13) 저장, 레퍼런스 변수 r 생성 후 r_a 변수 참조
④ 포인터 변수 p에 저장된 주소값(13)을 p_b 변수의 주소(14)로 변경, 레퍼런스 변수는 참조 변경 불가능
⑤ 포인터 변수 p에 저장된 p_b 변수의 주소(14)를 역참조(*p) 하여 p_b의 원본 값을 777로 변경
레퍼런스 변수 r이 참조하는 r_a 변수의 원본 값을 888로 변경
(참고)
사진상 별표와 같이
변수 선언에 쓰는 포인터 기호(*)와 레퍼런스 기호(&)는 변수에 쓰는 * 기호와 & 기호와 역할이 다르다.
(int* p = &a // 변수 a의 주소를 받는 포인터 변수) != (*p = 777 // 포인터 변수 p에 저장된 a의 주소를 역참조)
(int& r = b // 변수 b를 참조하는 레퍼런스 변수) != (p = &b // 변수 b의 주소를 p에 대입)
한마디로 포인터 변수는 변수의 주소만 담을 수 있는 변수이고
레퍼런스 변수는 처음 선언할 때 참조할 변수를 지정해주면 그 변수 자체가 되는 것이다.
데이터베이스를 알면 레퍼런스 변수를 종속 관계 개념으로 생각하면 될거 같다.
const 위치에 따른 상수화 대상
const를 변수명 앞에 붙일거냐 자료형 앞에 붙일거냐에 따라 용도가 달라진다.
먼저 const가 변수명 앞에 왔을 경우이다.
p 앞에 const를 붙이면 p의 값을 상수화 한다는 뜻으로 값이 한번 지정되면 변경할 수 없다.
포인터 변수 p는 p_a 변수의 주소로 지정되고 상수가 되어 이후 p_b의 주소로 변경할 수 없다.
r 앞에 const를 붙이면 r의 값을 상수화 한다는 뜻이지만 레퍼런스(&) 자료형은 이미 상수로 선언된다.
붙이나 안붙이나 똑같은 상수라는 말이다. 레퍼런스 변수 r은 r_a를 참조하게 되고 어떤 것이든 바꿀 수 없다.
그리고 const가 자료형 앞에 왔을 경우이다.
이때는 포인터 변수 역참조 하거나 레퍼런스 변수로 참조된 변수 즉 원본을 수정 할 수 없다.
쉽게 말하면 변수명 앞에 const가 붙을 경우 그 대상의 주소를 바꿀 수 없고
자료형 앞에 const가 붙을 경우 그 대상의 값을 바꿀 수 없는 것이다.
'공부 > C언어, C++' 카테고리의 다른 글
[C언어/C++] VS Code 파일 열때마다 한글 깨짐 해결 방법(UTF-8 ->EUC-KR 자동 인코딩 설정) (0) | 2023.07.25 |
---|---|
[C언어/C++] C언어와 C++문법에서의 struct와 class의 차이점 (0) | 2023.07.25 |
[C언어/C++] VS Code 자동 세미콜론(;) 추천 익스텐션 Colonize (0) | 2023.07.24 |
[C언어/C++] VS Code 서식 자동 정렬시 포인터 선언(*) 위치 바꾸기(서식 지정 규칙 바꾸기) (0) | 2023.07.24 |
[C언어/C++] typedef struct 언제 써야 하나?(typedef struct 구조체 선언) (0) | 2023.03.16 |