[C++ call by value, call by reference, 기억 클래스(지역, 전역) ]

·2022년 7월 19일
0

C++_Study

목록 보기
6/25

#220719

#3-16. call by value (값에 의한 호출) vs call by reference

  • <매개변수를 전달하는 방법>
    • 기본: 값에 의한 호출 (call by value)
      - 실매개변수의 값을 형식매개변수로 전달
      - 함수 내부에서 형식매개변수가 변경되더라도 실매개변수는 변경되지 않음!
    • 주소에 의한 호출(포인터 사용/ call by reference)
      - 실매개변수의 주소를 형식매개변수로 전달
      - 형식매개변수가 변하면 실매개변수도 변하게 할 수있음 '포인터'를 사용해서!
  • [call by reference]
int sum(int *pa, int *pb);
int main(void)
{
    int a = 2, b = 5, c = 0; 
    std::cout << "sum()호출 전 a = " << a << std::endl; 
    std::cout << "sum()호출 전 b = " << b << std::endl; 
    std::cout << "sum()호출 전 c = " << c << std::endl; 

    c = sum(&a, &b);

    std::cout << "sum()호출 후 a = " << a << std::endl; 
    std::cout << "sum()호출 후 b = " << b << std::endl; 
    std::cout << "sum()호출 후 c = " << c << std::endl; 

    return 0;
}

int sum(int *pa, int *pb){
    // a의 주소가 포인터 pa로 전달됨 
    *pa = *pa + 2;
    *pb = *pb + 5;
    return(*pa + *pb);
}

#3-17. 구조적 프로그래밍과 모듈화 연습

#3-18. 기억클래스(지역, 전역, auto,static)

  • 지역(local)변수와 전역(global) 변수
    • 지역변수는 함수나 블록 ({}) 안에서만 사용 가능하고, 전역 변수는 소스 전체에서 사용 가능!
    • 선언 위치에 따라 결정됨
    • 함수나 블록 안에서 변수를 선언하면 지역변수, main()함수 밖에서 선언하면 전역변수!
#include <iostream>

void show(void); 
int x; 			//전역 변수 
//정적 데이터 영역에 저장 

int main(void)
{
	int y; 		//지역 변수 
    //스택에 저장
}
void show(void)
{
	int z; 		//지역 변수 
}
  • 기억 클래스: 자동(auto)
    • auto int a; (auto는 생략이 가능하여 int a;와 같음)
    • 함수 또는 블록 내부에서 선언, 블록 내에서만 유효함
    • 스택 공간을 일시적으로 사용
    • 함수나 블록을 진입하면 기억 영역이 확보되고, 벗어나면 기억 영역은 바로 소거됨. 단 return 문으로 리턴된 값은 스택에 복사되어 외부로 전달
    • 초기화는 실행시 이루어 지며, 초기화 하지 않으면 임의의 쓰레기값을 가짐.
int main(void)
{
    // 지역 변수는 스택에서 일시적으로 저장되며 선언된 블록내에서만 접근 가능하고 유효함
    int k = 10;                         // 지역 변수
    std::cout << "k=" << k << std::endl;
    {
        int k = 20;                     // 지역 변수
        k+=10;
        std::cout << "k=" << k << std::endl;

    }
    k += 6;
    std::cout << "k=" << k << std::endl;
    return 0;

}
void sub(void);
int main(void)
{
    sub();		// x=10, y=10
    sub();		// x=10, y=11
    sub();		// x=10, y=12
    return 0;
}

void sub(void)
{
    int x = 10;         //auto (자동 범위 변수: 실행할때 만들어지고 블럭 사라지면 사라짐)  
    //static (정적 변수) 처음 실행시 '한 번만' 초기화 (블록 내에서만 유효, 돌아왔을 때 이전값을 다시 이용 가능) 
    static int y = 10;  
    std::cout << "x=" << x << "y=" << y << std::endl;
    x++;
    y++;
}

업로드중..

profile
Hakuna Matata

0개의 댓글

관련 채용 정보