더블 포인터

sesame·2022년 1월 2일
0

교육

목록 보기
12/46

call by value, call by reference

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을 사용할 수 없다.
그래서 포인터함수의 주소를 가져와서 사용하는것

0개의 댓글