2020. 10. 20. 19:32ㆍ컴퓨터 수업/자료구조
QUIZ
reference type은 무조건 lhs에 있다.
ex) p = &a -> a는 무조건 주소연산자
new연산자는 어떤 특정 메모리에 heap 메모리를 할당하기도 하지만, 해당 포인터가 이미 가르키는 메모리주소가 있다면 해당 메모리를 다른곳으로 치우고 heap memory를 할당한다. 따라서 정리하자면
px = new int;
에서 new는 px에 다른 임의의 값을 집어넣고 (다른 주소를 대입하고(이는 무조건 heap 주소이다.)), 해당 주소에 메모리를 4byte할당한다.
마찬가지로
delete px;
에서 delete는 px가 가르키는 메모리를 해제하고 해당 포인터를 다른곳으로 치워버린다.
c++에서 call by reference는 reference type의 parameter를 가지는 함수 말고는 없다.
포인터변수를 이용하는것도 call by value일 뿐이다.
다음 예시를 보자
여기서 func의 파라미터와 함수 call 부분의 아규먼트를 보자면
int * py = px 이다. 여기서 px가 가르키는 메모리 주소의 값이 py에게 복사되어 주어진다.
원래대로라면 py의 역참조 값을 바꾼다면 px의 역참조 값도 바뀐는것이 맞다 (같은 메모리를 참조하니까)
하지만 여기서 py는 new operator에의해 다른곳을 참조하게 되었고, 둘은 갈라서게 된다.
따라서 다음과 같은 예제도 한번 보자
여기서도 py가 참조하는 메모리를 전환했지만 px의 값은 그대로이다 어림도없다쿸쿠
그렇다면 진짜 call by reference로 포인터변수를 reference 참조하고 싶다면
포인터 참조자를 사용해야한다 문법은 * 다음 &를 사용해서 다음과 같이 행한다.
#include <iostream>
using namespace std;
void func(int *&py){
py = new int;
*py= 7;
}
int main() {
int x= 3;
int *px = &x;
int *&rx = px;
cout << "depth 0 px : " << *px << endl;
cout << "depth 0 rx : " << *rx << endl;
cout << "depth 1 px : " << px << endl;
cout << "depth 1 rx : " << rx << endl;
cout << "depth 2 px : " << &px << endl;
cout << "depth 2 rx : " << &rx << endl;
}
depth 0 px : 3
depth 0 rx : 3
depth 1 px : 0x61ff08
depth 1 rx : 0x61ff08
depth 2 px : 0x61ff04
depth 2 rx : 0x61ff04
즉 참조자는 말그대로 어느 depth든지 다 참조한다. (못도망감 ㅠㅠ)
따라서 이 위의 func는 말그대로 px의 new int를 행하는것이므로 px가 new int하는것과 같다.
정리하자면,
func(int *py)는 결국 call by value이다.func(int *&rx)는 포인터 참조자이다. depth-2까지 참조한다 (어차피 depth-2가 끝이다, 포인터변수에 대해)
Array-based Unsorted List
Array-based Unsorted List Delete가 한개만 지우고, 해당 아이템이 없으면 에러나는 문제를
해결했음
Array-based Sorted List
RetriveItem 메소드를 보며 binary search 알고리즘을 배웠음
moreToSearch = first <=last인 이유는
first는 알고리즘 진행시 우측 (++)되는 경향이 있고
last는 알고리즘 진행시 좌측(--) 되는 경향이 있으므로
first <= last가 된 순간 찾거나 못찾은것이므로
'컴퓨터 수업 > 자료구조' 카테고리의 다른 글
Linked-Node. (0) | 2020.10.16 |
---|---|
큐 Queue (0) | 2020.10.07 |
리스트와 스택의 차이 (0) | 2020.10.05 |
Big O notation (0) | 2020.09.15 |
List (0) | 2020.09.15 |