기초CS- 포인터 3

킴스코딩클럽·2022년 10월 13일
1

CS기초 시리즈

목록 보기
32/71

포인터 2 요약

  • 참조
  • 배열
  • 복사가 없다
  • 메모리를 우리가 관리한다

int x;
int* p{&x};
*p = 3;

int x;
______________________________________
cpp에서의 참조형 
>한번 참조된 후 다른 곳으로 갈 수 없음
>선언과 동시에 반드시 선언 대상을 초기화해야함
int x;
int& 변수명{x};
x =3; 
참조형은 매개변수에 사용하기 좋다
______________________________________

상수와 참조형

const int& 변수명;

  • 상수를 참조하는 타입
  • l-value와 r-value를 모두 참조할 수 있음
  • const라서 수정을 불가능하다

l-value는 이름이 있어야함 (변수)

  • 포인터 변수로 받을 수 있다

r-value는 주소가 없다 (리터럴)

  • 포인터변수로 받을 수 없다
  • 참조형으로도 받을 수 없다
void Print(int& x) //참조형
{
	std::cout << x;
	x = 10;
}

int main()
{
	int x{1}; 
	//x : l-value(이름을 가진 객체) vs ex)10: r-value(이름이 없는 리터럴같은것)
	Print(x);
    Print(10); //불가능 : r-value
	std::cout << x;
}

우측값 참조(rvalue referecne)
상수를 가리키는 참조형을 써보자

void Print(const int& x) //상수의 참조형
{
	std::cout << x;

}

int main()
{
	int x{1}; 
	Print(x); 
	Print(10); //위와 다르게 가능함
	std::cout << x;
}
10은 메모리에 존재하지만 이름을 가지지 않음 
그래서 그 라인에서 벗어나면 찾아오지 못함 
하지만 그 라인에서는 쭉 사용가능 그 말은
함수로 들어가게 되더라도 매개변수로 복사되어 들어갈 수 있다 (rvalue를 참조하게 되는 것이다)
________________________________________________________

이 개념을 확장해서 이 경우도 가능하다
int main()
{
	int x{1}; 
	//x : l-value(이름을 가진 객체) vs ex)10: r-value(이름이 없는 리터럴같은것)
	Print(x); 
	Print(10);
	

	const int& ref3{ 10 + 30 * 3 }; 
	//const를 붙이면 우측값도 참조가능
	//단, 값을 바꿀 수는 없음
	std::cout << ref3; 
    std::cout<<&ref3;
    // 16번라인을 벗어나서도 계속 값을 꺼내오거나 주소를 참조할 수 있음

}
________________________________________________________

int main()
{
	//실제 rvalue reference
	int&& ref4{ 10 };
	ref4 = 10;
}

rvalue와 lvalue모두 참조형을 사용할 수 있다는 측면에서 유용하다고 이해하기
더 자세히 알아보려면 클래스라는 개념을 알아야함

profile
공부 기록용

0개의 댓글