포인터와 함수 - 값에 의한 호출(Call By Value), 주소에 의한 호출(Call By Reference)

CODEDRAGON Development/C, C++

반응형

   

Call By Value vs Call By Reference

두 개의 호출방식의 차이 반드시 숙지

   

   

값에 의한 호출(Call By Value)

변수(메모리 공간에 저장된 값) 또는 값을 복사해서 함수 호출

   

Call By Value 도식도

  

//변수 n의 값을 변수 i에 복사

   

   

   

   

   

   

   

   

   

   

   

// 10

   

   

주소에 의한 호출(Call By Reference)

주소(메모리 공간의 주소)를 참조해서 함수 호출

   

Call By Reference 도식도

  

//변수 n의 주소를 포인터 변수 i에 저장

   

   

   

   

   

   

   

   

   

   

// i는 포인터 변수로 주소값 저장

// i = &n

   

   

  

   

   

함수의 출력, 입력 형태

구분

출력 형태

입력 형태

XX 형태

출력 형태 없음

입력 형태 없음

XO 형태

출력 형태 없음

입력 형태 있음

OX 형태

출력 형태 있음

입력 형태 없음

OO 형태

출력 형태 있음

입력 형태 있음

   

   

값에 의한 호출(Call by value)의 문제

함수의 인자 전달에 사용되는 매개 변수가 많아지게 됩니다.

#include <stdio.h>

void func(int a1, int a2, int a3, int a4, int a5, int a6, int a7); 

int main(void){

   int a=10, b=20, c=30, d=40, e=50, f=60, g=70;               

   func(a, b, c, d, e, f, g,);

   return 0;

}

 void func(int a1, int a2, int a3, int a4, int a5, int a6, int a7){

   printf("%%%%%%%d \n", a1, a2, a3, a4, a5, a6, a7);

}

   

   

주소에 의한 호출의 필요성

  • 배열이나 구조체와 같은 데이터를 함수에 전달할 때 유용
  • 실행시간 단축, 메모리 공간 적게 차지함

   

//sizeof(array: 28byte

//sizeof(int): 4byte

   

// 28/4 = 7

   

   

   

   

//포인터변수p에 배열array의 시작주소 저장

//변수num에 7 저장