지금 Tree 클래스 자료구조 짜고 있는데
각 트리 요소를
struct Node{
int data;
Node* left;
Node* right;
}
이렇게 노드로 만들어서 배치하고 있는데
트리 삽입 삭제 함수 만들때 insert(Node* T) 이런식으로 넘겨주면
콜바이밸류 식으로 작동을 해서 자식노드 생성이 안돼;;
무조건 insert(Node*& T)이렇게 넘겨야 정확히 작동함
아니 너무 혼란스러운데... 포인터로 인자넘기면 레퍼런스기호 안붙여도 무조건 call by reference로 작동하는거 아닌가?
포인터 인자는 주솟'값'을 전달하는 콜바이밸류임
주소값 넘겨주는건 알겠는데, 결국엔 그 주솟값 그대로 객체로 가서 작동하니까 call by refer로 작동하잖아. 대부분 경우는 그런데 반례가 나와서 머리가 혼란스러움
그렇게 작동하는 것처럼 보이는 것하고 실제로 그런건 괴리가 있지. 전자에서 T는 레퍼런스 변수가 아니라 그냥 인자로 넘겨받은 주소를 갖고 있는 포인터 변수임
방금 그림 몇개그리다보니까 왜 잘못된건지 이해가긴 했다 근데 C++ 말고 C에서는 이렇게 재귀함수로 자식노드들에 계속 동적할당하는 구조 어케 만들지 그럼;; C에서는 레퍼런스로 못넘겨주는데
왜못함? T->right = (Node*)malloc(sizeof(Node)); 하면 되는데
void insert(int data, Node* t) { if (t == nullptr) t = new Node{ data,nullptr,nullptr,0 }; else if (data < t->data) insert(data, t->left); else if (data > t->data) insert(data, t->right); Balance(t); }이건데 여기서 맨위에 인자에 포인터 기호 붙어있어도 레퍼런스 기호 안붙여주면 내가 질문올린거처럼 노드의 레프트 라이트 자식노드들에 할당되는게 반영이 안됨근데 C에서는 레퍼런스 기호를 못붙이잖아
이런경우에는 이중포인터 쓰면 됨. void insert(int data, Node** t) { *t = (Node*)malloc(sizeof(Node)); ~~ insert(data, &(*t->right)); } 이런식으로 하면된다
진짜 좆같은 언어네 ㅋㅋ
ㄴ이게낫네
고수네 ㄱㅅ
주소를 넘기는건 주소를 복사해서 넘기는거라 call value고 일각에서는 call address라고 부르기도 하더라 call refer는 용법이 따로 있음
빡대가리야 전체 코드를 올려
ㅋㅋㅋㅋㅋ 내가 씨발 이때까지 코드 올리면 봐주는놈을 못봤는데
내가 없을 때 질문해서 그런거
& 레퍼런스 자체가 컴파일 할땐 포인터로 바낀다고 보면 됨. → **로 해
이건 또 먼소리여