ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C 언어 기초 정리 07] Call by value & Call by reference와 메모리 구조
    개발 이야기/C 2023. 9. 29. 21:10

    Call by value & Call by reference

    함수를 호출 시 필요한 데이터를 인자로 전달하는 2가지 방법이다. 

    call by value의 경우 값을 복사하여 전달하고, call by reference의 경우 데이터의 주소를 복사하여 전달한다.

    전자의 경우는 원본의 값이 변경되지 않고, 후자의 경우 값이 변경된다.

    Call by value 

    값에 의한 전달 방법은 인수로 전달되는 변수가 가지고 있는 값을 복사하여 전달하는 방식으로 완전히 별개의 변수로 취급된다. 즉, 함수내에서 값을 변경하더라도 이것이 전혀 원 인자에 영향을 주지 않는다. 

    #include <stdio.h>
    
    void swap(int *x, int *y) {
            // 주소에 저장된 실제값들을 교환
            int temp = *x;
            *x = *y;
            *y = temp;
    }
    
    void swap_value(int x, int y) {
            // call by value
            int temp = x;
            x = y;
            y = temp;
    }
    
    int main(void) {
            int a = 10, b = 20;
            printf("%d %d \n", a, b);
            swap(&a, &b);   // 참조하는 주소값을 전달
            printf("%d %d \n", a, b);
    }

    Call by reference

    참조에 의한 전달은 주소값을 전달하기에 해당 변수의 주소값에 가서 직접 데이터를 조작할 수 있다. 

    위의 코드 예시를 참고하자. 

     

    - 배열을 이용한 값 변경(반환을 여러개 하는 꼼수)

    배열의 경우도 배열 파트(https://secundo.tistory.com/63)에서 말했듯이 배열의 이름은 포인터와 동일하게 작용한자. 그렇기에 배열을 전달하는 경우에는 우리가 임의로 지정하지 않아도 Call-by-reference이다. 

    이를 이용해 반환을 여러개하는 꼼수가 가능하다. 실제로 반환을 여러개하는것은 아니지만 값을 변경할 수 있다라는 의미에서 위와 같은 표현을 사용하였다. 

    void zbrak(float (*fx)(float), float x1, float x2, int n, float xb1[],
    	float xb2[], int *nb)
    {
    	int nbb,i;
    	float x,fp,fc,dx;
    
    	nbb=0;
    	dx=(x2-x1)/n;
    	fp=(*fx)(x=x1);
    	for (i=1;i<=n;i++) {
    		fc=(*fx)(x += dx);
    		if (fc*fp <= 0.0) {
    			xb1[++nbb]=x-dx;
    			xb2[nbb]=x;
    			if(*nb == nbb) return;
    
    		}
    		fp=fc;
    	}
    	*nb = nbb;
    }

    즉, 배열을 이용해 여러 값을 변경할 수도 있다. 

    위의 코드가 예시이다. zbrak함수는 xb1과 xb2의 값을 변경한다. 이는 배열의 경우 call by reference방식으로 값을 전달하기 때문이다. 

     

    메모리 구조 

    간단히 컴퓨터의 메모리 구조에 대해 작성하려고 한다. 컴퓨터 구조에서 더 자세히 다루지만 일단은 대략적인 그림으로 이해해보자. 

    메모리 공간은 크게

    1. 코드(code) 영역: CPU가 코드를 한 명력어씩 가져가 처리하는 구역

    2. 데이터(data) 영역: Static, Global 변수가 저장되는 곳, 프로그램의 시작과 함께 할당되며 프로그램 종료시 소멸

    3. 스택(stack) 영역: 함수 호출 시는 Stack 영역과 관련이 있다. 스택 영역은 함수의 호출과 함께 할당되면서 함수의 호출이 완료되면 소멸한다. 지역변수가 소멸하는 것도 여기와 상관이 있다. 

    4. 힙(heap) 영역: 사용자가 직접 관리하는 동적 메모리 영역 

    으로 구성된다. 

     

     

    메모리 구조

    낮은 주소가 0번대를 의미한다. 

Designed by Tistory.