승쨩개발공부

[C++] 포인터 / const포인터 본문

C++

[C++] 포인터 / const포인터

SeungHyune 2021. 11. 24. 21:00

포인터

저장하는 값이 주소인 변수이다.

다른 말로 "간접 참조" 라고도 한다. (프로그래밍에서 참조라는 말은 접근을 뜻한다.)

포인터는 변수에 직접적으로 접근하지 않고, 주소를 통해 접근을 한다.

 

 

 

 

주소 확인

메모리에 등록된 변수명 앞에 어드레스(&) 연산자를 붙여주면 주소를 확인할 수 있다.

 

 

 

포인터 선언

자료형과 변수명 사이에 에스크리터(*)를 추가하면 포인터 변수 선언이 된다.

 

 

 

 

 

포인터 변수 초기화

 

다음과 같이 포인터를 선언하게 될 경우 쓰레기값이 초기화가 되버린다.

 

쓰레기 값 초기화?

-> ptr이라는 변수에 쓰레기 값으로 초기화가 진행된다.

-> 초기화된 값을 주소로 읽으면 어디를 가리킬지 모르는 상황이 발생

-> 만약, 해당 주소가 운영체제를 가동하는데 중요한 위치를 가리킨다면?

-> 그리고 그 값을 사용자가 변경한다면, 운영체제에 큰 문제가 발생할 가능성이 생긴다.

-> 단, 요즘의 운영체제는 할당받지 않은 메모리 접근의 시도가 있을 경우

-> 이를 감지하면 해당 프로그램을 강제로 종료시켜버린다고 한다.

 

 

nullptr?

포인터 변수를 초기화 할 떄 값을 0으로 넣게되면 결과는 00000000 이런식으로 나오게 된다.

이것은 0번지 주소를 의미하는 것이 아니고, 아무런 곳도 가리키고 있지 않다는 의미이다.

그런데 만약 포인터 변수 초기화 값이 일반 변수의 초기화 값과 같다면 햇갈리는 경우가 생길 수가 있어,

이를 방지하기 위해 C++에는 nullptr이라는 것이 존재한다.

 

 

 

포인터를 사용하는 이유

원본 데이터의 값을 읽고 쓰기 위해서 사용한다.

-> 원본의 값을 변경하기 위해서 사용한다.

 

 

 

 

 

포인터를 이용한 원본 데이터 변경

변수명 앞에 역참조 연산자(*)를 사용하면 원본 데이터에 점근할 수 있다.

 

 

역참조 연산자를 읽는 방법

해당 포인터 변수가 가지고 있는 주소로 찾아가 값을 확인(바꿔라)해라.

 

 

에스크리터와 역참조 연산자를 구분하는 방법

변수 선언 시 사용한 * 은 에스크리터.

변수 선언 후 사용한 * 은 역참조 연산자.

 

 

 

 

포인터의 크기

포인터는 4bytes라는 고정된 크기를 가진다.

포인터의 크기는 운영체제에 따라 고정된 크기를 가지게 된다.

-> 32bits 운영체제 : 4bytes

-> 64bits 운영체제 : 8bytes

 

 

 

 

const와 포인터

const의 위치에 따라 상수화가 되는 부분이 달라진다

const는 바로 뒤에 있는 것을 상수화 시킨다

 

 

1. const가 에스크리터 앞에 붙는 경우
역참조로 인한 값 변경은 불가능하다
참조하는 주소 변경은 가능하다

 

 



2. const가 에스크리터 뒤에 붙는 경우
역참조로 인한 값 변경은 가능하다
참조하는 주소 변경은 불가능하다

 

 

 

 

이중 포인터

포인터 변수도 메모리에 등록이 된다

-> 포인터 변수 또한 시작 주소를 할당 받는다.

포인터 변수의 주소를 저장하는 포인터를 이중 포인터라 한다.

 

이중 포인터를 사용하는 이유?

원본의 값을 변경하기 위해 사용한다.

이중 포인터의 원본은 포인터다.

 

'C++' 카테고리의 다른 글

[C++] 문자열 함수 / 메모리 함수  (0) 2021.11.25
[C++] 배열  (0) 2021.11.24
[C++] 함수, 함수 오버로딩 , 디폴트 매개 변수  (0) 2021.11.24
[C++] 반복문(while, do while, for)  (0) 2021.11.24
[C++] 분기문 (if , switch)  (0) 2021.11.23