Pages

Showing posts with label C언어 학습-3(호출방법). Show all posts
Showing posts with label C언어 학습-3(호출방법). Show all posts

Saturday, February 3, 2018

C/C++ 언어 프로그래밍-호출방법2

C/C++ 언어 코딩 복습 - 호출 방법 2 (Call by address)

주소에 의한 호출 (call by address) :

- 함수를 호출할 때 변수의 주소 값을 넘겨주는 방식입니다. 간단한 예를 살펴보겠습니다.

예제코드

#include <iostream>
using namespace std;

void TcallA(int *);

int main() {
     int a ;
     a = 1;
     cout <<" (1) In main function  : "<< "  a  = " << a << ", address of a = "<< &a << endl;

     TcallA(&a);
     cout <<" (2) In main function  : "<< "  a  = " << a << ", address of a = "<< &a << endl;
     return 0;
}

void TcallA(int *b){
     *b += 1;
      cout <<"     Call by address   : "<< "  b  = " << *b << ", address of b = "<< &b << endl;
}

- 인자가 포인터 변수인 TcallA 함수를 정의하였습니다. 이 때 함수의 프로토 타입의 인자가 포인터 이므로 '*' 을 붙여 나타내었습니다.

- TcallA 함수는 주소값 (int *b) 을 인자로 넘겨받고, 이 주소가 가리키는 곳의 값을 하나 증가 시키는 일을 합니다 (*b += 1;). 증가된 값과 포인터 변수의 주소를 출력하도록 하였습니다.

- main 함수에 정수형 변수 'a' 를 선언하고 1 을 대입하였습니다. 그리고 먼저 'a' 의 값과 변수 'a' 의 주소를 출력하도록 하였습니다.

- TcallA 함수를 호출할 때 변수 'a' 의 주소값을 인자로 주었습니다 ( TcallA(&a); ). 그리고 다시 한번 변수 'a' 의 값과 주소를 출력하도록 하였습니다.

실행결과


- 첫번째 줄에서는 main 함수에서 정의한 변수 'a' 에 대입되어 있는 값 (a = 1) 과 주소값이 출력 되었습니다.

- 두번째 줄에서는 'call by address' 방식으로 작성된 함수 TcallA 의 결과가 나타나 있습니다. 포인터 변수 b 가 가리키는 곳의 값이 1 증가되어 (b = 2) 출력되었고 포인터 변수 b 의 주소값 도 출력되었습니다. main 함수에서 정의된 변수 'a' 의 주소값과 다름을 알 수 있습니다.

- 세번째 줄에서는 main 함수의 변수 'a' 에 대한 결과가 출력되었습니다. 변수 'a' 의 값이 2로 바뀌었음을 알 수 있습니다. 물론 주소값은 첫번째 줄과 동일한 값으로 'a' 에 저장된 값만 바뀐 것을 알 수 있습니다.

C/C++ 언어 프로그래밍-호출방법1

C/C++ 언어 코딩 복습 - 호출 방법 1 (Call by value, call by reference) http://blogimgs.naver.net/imgs/nblog/spc.gif

- 함수들을 이용할 때 데이터들을 넘겨주는 방식에 대해 알아보겠습니다. 대표적인 방식으로는 값에 의한 호출 (call by value), 참조에 의한 호출 (call by reference), 주소에 의한 호출 (call by address) 이 있습니다.

값에 의한 호출 (call by value) :

- 이전까지 주로 사용하던 방식으로 함수를 호출할 때 변수 자체를 넘기는 것이 아니라 변수에 저장된 값만을 값만 넘겨주는 방식입니다. 간단한 예를 살펴보겠습니다.

예제코드

#include <iostream>
using namespace std;

void TcallV(int);

int main() {
     int a ;
     a = 1;
     TcallV(a);
     cout <<" In main function  : "<< "  a  = " << a << ", address of a = "<< &a << endl;
     return 0;
}

void TcallV(int a){
     a += 1;
     cout <<" Call by value     : "<< "  a  = " << a << ", address of a = "<< &a << endl;
}

- 정수형 인자 하나를 갖고 반환값이 없는 TcallV 함수를 선언하였습니다. 이 함수에서는 넘겨받은 정수형 인자에 1을 더해서 (a += 1;) 다시 대입하도록 하였습니다. 그리고 'a' 의 값과 주소값을 출력 하도록 하였습니다.

- main 함수에서 정수형 변수 'a' 를 선언하고 1을 대입하였습니다. 그리고 TcallV 함수의 인자로 'a' 를 주었습니다. 그 다음 메인 함수의 'a' 의 값과 주소값을 출력하도록 하였습니다.

실행결과


- TcallV 함수의 결과로 " Call by value    :   a  = 2" 라는 결과가 출력되었습니다. main 함수의 변수 'a' 의 값 1을 넘겨받아 TcallV 함수의 변수 'a' 에 1을 대입하고 'a +=1;' 이라는 문장을 수행해 결과로 2 라는 값을 출력하였습니다. TcallV 함수의 변수 'a' 의 주소값은 "0x7ffd01c5d8bc " 라고 출력 되었습니다.

- main 함수에서 출력된 변수 'a' 의 값은 1 이라는 결과를 얻었습니다. 즉, main 함수의 변수 'a' 와 TcallV 함수의 변수 'a' 는 서로 다른 독립적인 변수임을 알 수 있습니다. 또한 두 변수의 주소값을 확인해보면 서로 다름을 알 수 있습니다.

참조에 의한 호출 (call by reference) :

- 같은 변수를 다른 이름 (별칭) 으로 사용하고 싶을 때 사용되는 방법입니다. 사용법은 다음과 같습니다.

사용법
int a = 1;
int &b = a;

- 정수형 변수 a 를 선언하고 1 을 대입합니다. reference 변수 b (&b) 를 선언하고 앞에서 선언한 a 를 지정합니다. 앞으로 a 를 b 라는 이름으로도 사용하겠다는 의미 입니다.

- 간단한 예로 살펴보겠습니다.

#include <iostream>
using namespace std;

void TcallR(int &);

int main() {
     int a ;
     a = 1;
     TcallR(a);
     cout <<" In main function  : "<< "  a  = " << a << ", address of a = "<< &a << endl;
     return 0;
}

void TcallR(int &b){
     b += 1;
     cout <<" Call by reference : "<< "  b  = " << b << ", address of b = "<< &b << endl;
}

- TcallR(int &b) 함수 정의부분에서 전달받는 인자의 형태를 &b 로 지정하였습니다. 즉, 전달받는 매개변수를 다른 이름으로 사용하겠다는 것입니다. 결과를 확인해보겠습니다.

실행결과


- TcallR 함수의 'b' 와 main 함수의 'a' 둘다 2 의 값이 대입되어 있고 출력되는 것을 볼 수 있습니다. 또한 주소값이 동일함을 알 수 있습니다.

- 즉, TcallR 함수 내에서 main 함수의 변수 'a' 를 변수 'b' 의 이름으로 사용하고 있다는 것입니다.