void call_by_value(int val) {
val = 20;
}
void call_by_refer(int *ref) {
*ref = 20;
}
int main() {
int value = 10;
nt refer = 10;
printf("before : value=%d, refer=%d\n", value, refer);
call_by_value(value);
call_by_refer(&refer);
printf("after : value=%d, refer=%d\n", value, refer);
}
//before : value=10, refer=10
//after : value=10, refer=20
함수를 호출할 때 전달하는 인자는 변수 자체를 전달하는 것이 아니라, 변수에 저장된 값을 전달합니다.
그리고 서브 함수 내에서 별도의 변수를 만들어 값을 담아서 사용하게 된다.
즉 main()에서의 value와 call_by_value()의 val 변수는 서로 다른 메모리에 존재하는 사실상 각각 별개의 변수로서 존재
그러면, call_by_refer() 에서 *ref = 20; 을 실행했을 때는 왜 refer에 20이 저장되었을까?
그 이유는 ref 라는 변수에다 저장을 한 것이 아니라, ref 즉 ref가 가지고 있는 주소값 위치에 20을 저장했기 때문이다.
왜냐하면 ref는 &refer였으므로 refer의 주소를 가지고 있는데, ref는 ref가 가지고 있는 주소에 해당하는 메모리의 값을 뜻하기 때문에, refer의 값을 의미한다.
call_by_refer()와 call_by_value()에 대해서 얘기를 할때, call_by_refer()는 주소값을 넘긴 것이고, call_by_value()는 변수값을 넘긴 것이다.
포인터: 변수의 주소값
더블 포인터: 포인터 변수의 주소값
int global_val = 30;
void call_by_value(int *val) {
val = &global_val;
}
void call_by_refer(int **ref) {
*ref = &global_val;
}
int main() {
int local_val = 10;
int *value = &local_val;
int *refer = &local_val;
printf("before : *value=%d, *refer=%d\n", *value, *refer);
call_by_value(value);
call_by_refer(&refer);
printf("after : *value=%d, *refer=%d\n", *value, *refer);
}
//before : *value=10, *refer=10
//after : *value=10, *refer=30
call_by_value()에서의 val은 &global_val을 받긴 하지만 함수를 종료하고 나면 값은 사라집니다. 그러므로, main()에서는 여전히 local_val을 가리키고 있으며, 10이 출력된다.
call_by_refer()에서의 ref는 포인터변수의 주소값이므로, *ref 에 &global_val를 넣게 되면 main()에서의 refer 값이 변경되는 셈이므로, local_val이 아니라 global_val을 가리키고 있으며, 30이 출력된다.
'내가 담고자 하는 포인터 변수의 주소값'이 필요
main()에서 전달하는 변수가 포인터변수였고, 그 포인터 변수의 주소값을 넘겨야 하므로 &refer가 되어야한다.
int *ptr;
ptr = malloc(size);
해야하기 때문에
void allocMemory(void *ptr, int size) { // 반환값 없음, void 포인터 매개변수 지정
ptr = malloc(size); // ptr은 allocMemory를 벗어나면 사용할 수 없음
}
서브 함수 내에서 별도의 변수를 만들어 값을 담아서 사용하기 때문에 서브함수를 벗어나면 ptr을 사용할 수 없다.
그래서 포인터함수의 주소를 가져와서 사용하는것