포인터 vs 참조

CJB_ny·2022년 8월 3일
0

C++ 정리

목록 보기
35/95
post-thumbnail

포인터 vs 참조

  1. 성능
    포인터 참조 똑같다.
  2. 편의성
    참조 좋다.
    근데 무조건 장점만은 아님.

참조 마음대로 고칠 수 있기 때문에

const붙여준다.

포인터도 const 붙이는거 가능하다.

const int || int const

경우가 뭐가 있냐면은

info = &다른변수; // 다른 변수의 주소값으로 대체

info->hp = 1000; // 주소에 접근해 값을 변경

별 앞쪽에 붙인다면?(뒤에 붙인다면)

int a = 10;
int* ptr = &a;

int* const ptr2 = &a;

ptr2 = &b; // 이런거 불가능.
주소값변수명데이터주소값변수명데이터
0x12121212ptr0x232323230x23232323a10

int* const ptr; 이렇게하면 주소값을 변경 못한다.

즉, ptr2의 데이터 부분을 변경할 수 없다.

별 이전에 붙인다면?

int a = 10;
const int* ptr = &a;

ptr->hp = 100; // 이런거 불가능

ptr이 가르키고있는 데이터의 내용물을 변경할 수 없다.

'원격' 바구나의 내용물을 발꿀 수 없음.

둘다 막는법

const int* const ptr;

이렇게하면됨.

초기화 여부

포인터는 처음에 초기화 안해줘도 ㄱㅊ은데

참조는 참조하는 대상이 없으면 안된다.

무조건 어떠한 값이라도 참조하고 있어야한다.

포인터를 사용할 때에는 항상 긴장

포인터가 인자로 들어오면은 이렇게 체크를 항상 해주어야한다.

아니면 크래쉬 나서 프로그램 뻗는다.

OUT ❗ (참조가 변경될 수 있는 힌트)

C#에서는 out이라는 '문법'이 따로 존재하는데

C++에서는 OUT이 조금 다르다.

이게 왜 나왔냐하면은

포인터랑 참조는 성향 차이이다.

뭔가 값이 변경되고 없는값도 나올 때는 포인터 사용하고

그냥 읽기 전용일때는 참조사용하는데

읽기 전용이거나 혹시나 참조받은것을 값을 수정해야할때

그냥 함수에다가

Test(info); 이렇게만 넣어주면 뭐하는건지 모르기 때문에

#define OUT 전처리기 한번 선언해주고

void Test(OUT Info& info)
{
	info.hp = 1000;
}

이렇게 'OUT'키워드를 사용해서

바뀔 수 있다는 "힌트"를 주는 것이다.

가독성 차원에서는 OUT이 있지만

컴파일 차원에서는 아무것도 없는거랑 똑같다.

#define OUT 

void Test(OUT Info& info)
{
	info.hp = 1000;
}

void Test(Info& info)
{
	info.hp = 1000;
}

똑같은 거다.

이렇게 레퍼런스를 넘겨주고 값이 변경될 수도있다는 힌트를 주는 것이다.

참고 ❗

포인터로 사용하던 변수를 참조로 넘겨 주려면?

int* ptr = &a;

void Test(int& value)
{
	
}

Test함수에 인자로 넘겨주려면

Test(ptr) 안된다.

Test(*ptr); 해주어야 주소의 원본에 접근했다! 라는것을 넘겨주면 됨.

(그러면 원본에 접근을 하는 것이니까)

이것을 풀어서 쓰자면은

이런 느낌이다.

참조로 사용하던 것을 포인터로 넘겨주려면?

PrintInfoRef 함수는 포인터변수를 매개변수로 받는 함수인데

지금 reference라는 참조 변수를 넘겨주려면?

&reference를 넘겨주면된다.

PrintfInfoPtr(&reference);

"이 주소값을 참조해라!" 고 넘겨주면 된다.

풀어서 보면은 이런 느낌이다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글