[Jungle] Week4. Call by value, Call by reference

somi·2024년 4월 12일
0

[Krafton Jungle]

목록 보기
22/68

C 언어

포인터


#include <stdio.h>

int main() {
    int *p = NULL;
    int num = 15;

    p = &num;

    printf("int 변수 num의 주소 : %d \n", &num);
    printf("포인터 p의 값: %d \n", p);
    printf("포인터 p가 가리키는 값: %d \n", *p);


    return 0;
    
}

출력 결과)
int 변수 num의 주소 : 1870753276 - &num
포인터 p의 값: 1870753276 - p
포인터 p가 가리키는 값: 15 - *p


함수 호출 시 인자를 전달하는 방식의 차이

  • call by value: 값에 의한 호출
    호출된 함수 내에서 해당 인자 값이 복사된다.
    호출된 함수에서 인자의 값이 변경되어도 원래 변수의 값은 변하지 않음.
    주로 기본 자료형(정수, 실수 등)을 인자로 전달할 때 사용
  • call by reference: 참조에 의한 호출
    함수 호출 시에 인자로 전달되는 것은 변수의 주소(참조)
    호출된 함수 내에서 해당 인자를 통해 원래 변수에 접근하여 변경 가능
    호출된 함수에서 인자를 변경하면 원래 변수의 값도 변경됨
    주로 배열이나 객체와 같은 복합 자료형을 인자로 전달할 때 사용

call by value(값에 의한 호출): 인자로 받은 값 복사하여 처리 -> 복사하기 때문에 메모리량 증가, 과부하 But 원래 값은 영향을 받지 않아서 안전
call by reference(찹조에 의한 호출): 인자로 받은 값의 주소를 참조하여 직접 값에 영향


Call by Value

예시

#include <stdio.h>

void swap(int num1, int num2) {
	int temp = num1;
    num1 = num2;
    num2 = temp;
}

void main() {
	int a = 20, b = 60;
    swap(a, b);
    printf("a: %d, b: %d", a, b);
}

출력 결과)
a: 20, b: 60%
swap(a,b): 함수 내부에서만 a, b 변경 But a,b에게 전달하지는 못함


#include <stdio.h>

void swap(int x, int y){
    int temp;

    temp = x;
    x = y;
    y = temp;

    return ;
}

void swap(int x, int y );

int main() {
    int a = 10;
    int b = 20;

    printf("swap 전 a: %d\n", a);
    printf("swap 전 b: %d\n", b);

    swap(a, b);

    printf("swap 후 a: %d\n", a);
    printf("swap 후 b: %d\n", b);

    return 0;
}

출력 결과)

swap 전 a: 10
swap 전 b: 20
swap 후 a: 10
swap 후 b: 20

실제 값이 바뀌지 않는다.


Call by Reference

#include <stdio.h>

void swap(int *num1, int *num2) {
    int temp = *num1;
    *num1 = *num2 ;
    *num2 = temp ;
}

int main() {
    int a = 20,  b = 60;
    swap(&a, &b); // 주소를 전달하여 변수의 값 교환
    printf("a: %d, b: %d", a, b);
    return 0;
}

출력 결과)
a: 60, b: 20%


#include <stdio.h>

void swap(int *x, int *y) {
	int temp;
    temp = *x;
    *x = *y;
    *y = temp;
    
    return;
}

void swap (int *x, int *y);

int main() {
	int a =10 ;
    int b= 20;
    
    printf("swap 전 a: %d\n", a);
    printf("swap 전 b: %d\n", b);
    
    swap(&a, &b);
    
    printf("swap 후 a: %d\n", a);
    printf("swap 후 b: %d\n", b);
    
    return 0;
}

출력 결과)

swap 전 a: 10
swap 전 b: 20
swap 후 a: 20
swap 후 b: 10

*x = *y: 포인터를 통해 주소에 위치한 값 교환
*x: 포인터 x가 가리키는 메모리 주소에 저장된 값
*y: 포인터 y가 가리키는 메모리 주소에 저장된 값
=> 변수들의 값 교환



profile
📝 It's been waiting for you

0개의 댓글