c++

C++ 개인 필기(4) 포인터

Voitcon 2024. 1. 22. 18:00

포인터

int n=1; -> 스택 메모리에 있는 특정 주소에 우리가 원하는 값을 넣은 코드, 메모리에 이름을 붙인 것

 

포인터 -> 주소를 저장하는 가방

-> 4바이트(32비트) or 8바이트(64비트) 고정ㅇ크기

int a= *pt; -> 주소를 저장하는 가방이 가리키는 주소로 가서 값을 넣는다.

 

앞 TYPE는 자료크기에 영향을 주지 않지만 자료형이라는 추가 정보를 알리기 위해 type를 사용함.

타입이 일치하지 않는다면 메모리를 덮어써서 위험하다. (범위 초과)

 

1) 주소 연산자 & 해당 변수의 주소

2) 산술 연산자 +- 포인터 ++시 바이트 단위로 증가

3) 간접 연산자 * 변수의 해당 주소로 간다.

4) 간접 멤버 연산자 -> 구조체는 . 를 쓰지만 포인터는 ->를 사용한다. 언리얼엔진에서 자주 사용한다.

 

값 전달 방식 (*, &미사용) -> 값을 읽을때는 상관x 임시적으로 매개변수에 데이터를 통채로 복사

주소 전달 방식 (*사용)-> 주소값을 매개변수로 전달 / 원래의 데이터 사용

 

만약 구조체가 100바이트 구조체라면

값전달 -> 100바이트 복사

주소전달 -> 8바이트

c#의 경우 자동으로 골라짐.

 

참조 전달 방식 c++에만 있다. reference

int& ref=number -> 값전달 -> 참조 -> 주소

로우레벨(어셈블리) 관점으로 작동방식은 포인터와 같다.

c++ 관점에서는 number 라는 가방에 또다른 이름부여 ref라는 이름 부여

ref 라는 가방에다가 뭘 꺼내거나 넣으면 실제 number 가방

ref=3 == number=3

포인터, 레퍼런스 기능은 100% 똑같음, 성능도 같음

또다른 이름을 짓는 이유는 참조전달 때문 (문법의 차이)

값 전달 처럼 편리, 주소값을 이용해 원본을 가리킴