C언어/참고서: C언어 콘서트

C언어 46차시 포인터 연산, call by value, call by reference

Olivia-BlackCherry 2023. 4. 5. 23:57

목차

    1. 포인터 연산

    포인터에 대해서는 +, -만 가능하다. 

    포인터의 증감 연산시 증감되는 값은, 포인터가 가리키는 객체의 크기이다. 

    포인터 타입에 따라 증감되는 값이 다르다. 

    char 1, short 2, int 4, float 4, double 8이다. 

    출처 c언어 콘서트

     

    char *pc;

    int *pi;

    double *pd;

    로 데이터타입이 다른 포인터가 세 개 있을 때, 이들을 증감시키면 아래와 같이 이동한다. 

    출처 c언어 콘서트

     

     

    2. 함수가 외부로부터 데이터를 받는 방법

    1) call by value 값에 의한 호출

    함수가 호출될 때 복사본 parameter가 전달됨. 

    출처: c언어 콘서트

    따라서 함수 안에서 parameter가 변경해도 원본은 변하지 않음.

    버그를 막을 수 있는 좋은 방법. 

    <예시>

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <math.h>
    void modify(int value)
    {
    	value = 1;
    }
    
    int main(void)
    {
    	int number = 2;
    	modify(number);
    	printf("number= %d", number); //number=2
    
    	return 0;
    }

     

    2) call by reference 참조에 의한 호출

    함수가 호출될 때 원본 parameter가 전달됨.

    출처: c언어 콘서트

    따라서 함수 안에서 parameter을 변경하면 원본도 바뀜. 

    <예시 코드>

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <math.h>
    void modify(int *value)
    {
    	*value = 99;
    }
    
    int main(void)
    {
    	int number = 2;
    	modify(&number);
    	printf("number= %d", number); //number =99
    
    	return 0;
    }

     

    C언어는 기본적으로 call by value이다. 

    그런데 포인터를 함수에 전달하면 call by reference를 흉내낼 수 있는 것이다.  

     

     

    <예시코드>

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <math.h>
    void swap(int *px, int *py)
    {
    	int tmp;
    
    	tmp = *px;
    	*px = *py;
    	*py = tmp;
    }
    
    int main(void)
    {
    	int a = 10, b = 20;
    	printf("swap() 호출 전 a =%d, b=%d\n", a, b);
    
    	swap(&a, &b);
    
    	printf("swap() 호출 후 a=%d, b=%d", a, b);
    }