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' 이름으로 사용하고 있다는 것입니다.