1580, 79/79 회원가입  로그인  
   해킹잘하고싶다
   http://없음
   Call by value VS Call by Reference

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=8565 [복사]


※어셈블리어의 관점에서 바라보면 글이 너무 길어지니 C언어의 관점에서 바라보겠습니다.

직역하자면 값에 의한 호출과 참조에 의한 호출이라고 해석할 수 있다.
일단 두개의 소스를 보여주겠다.




=================================
// Call by vaule

#include <stdio.h>

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

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

    swap(a, b);

    printf("a : %d, b : %d\n", a, b);
    return 0;
}
=================================

위 소스의 같은 경우 main함수 내에서 int형 변수 a와 b를 swap함수의 인자로 넘겼다.
핵심만 요약해서 말하자면 main함수 변수를 swap함수에 넘긴다 하더라도
main함수 내부의 인자와 swap함수의 매개변수는 완전히 별개라고 생각해도 무방하다.
그래서 위 소스를 출력하면 a : 10, b : 20이라고 결과가 나온다.
그렇다면 main함수 내부의 변수 a와 b를
swap함수 내부에서 변경시킬려면 어떻게 해야 할까?
여기서 필요한 개념이 바로 Call by reference이다!

















=================================
// Call by reference

#include <stdio.h>

void swap(int *pA, int *pB)
{
    int temp;
    
    temp = *pA;
    *pA = *pB;
    *pB = temp;
}

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

    swap(&a, &b);

    printf("a : %d, b : %d\n", a, b);
    return 0;
}
===============================

뭔가 다르게 보이는가?
포인터의 개념을 안 다면 이해하는 것이 쉽다.

main함수 내부의 swap함수의 전달값으로 왜 a, b라고 안 하고 &a, &b라 했을까?
&(앰퍼센트)연산자는 주소를 의미한다.
swap함수 내부를 보면 *(에스터리스크)연산자를 사용하는데
*는 포인터의 개념 연산자로 *a라고 하면
a가 가리키는 변수를 의미하게 된다.
즉, swap함수의 매개변수와 main함수의 변수가 서로 "연결"이 되어서
a와 b의 값이 변경이 된다는 게 Call by reference의 개념이다.
(필자가 쓴 이 글을 이해하려면 포인터를 이해하고 있어야한다.)

  Hit : 444     Date : 2023/01/15 02:35



    
20   [퍼온글]리눅스 기본 명령어     한승재
06/06 4534
19   자격증 (문제)사이트 [2]     koreal33t
09/06 3852
18   CTF 사이트[1]     koreal33t
09/06 3987
17   윈도우,리눅스에서 내 ip를 확인해 보자 [1]     koreal33t
09/06 3408
16   신기한 프로그래밍 언어[3]     koreal33t
09/06 4172
15   홍보합니다. 신생 보안커뮤니티입니다.     kimwoojin0952
10/26 3823
14   데비안 계열 리눅스 의존성 깨졌을때 해결법     한승재
11/27 3955
13 비밀글입니다  감을못잡겠네요ㅜㅜ     잉잉잉
01/15 3
12   [팁] 우분투 미러링서버     한승재
03/09 3542
11   구글 백링크 작업 질문요     wkatnxka
03/30 2937
10   [팁] 파이썬 2소스를 3으로 변경해주는 사이트[3]     한승재
05/13 3410
9   K-Shield 주니어 5기 모집     lrtk
06/17 3646
8   무료 정보보안 기술인재 양성 과정 교육생 모집     chanjung111
06/17 3926
7   levitator.c (안드로이드 루팅) 공격 분석 소스 코드 공유.[4]     scube
08/17 3168
6   towelroot.c (zip) 코멘팅.[1]     scube
08/18 3170
5   (꼼수) L.O.B 한방에 클리어하기[1]     해킹잘하고싶다
01/14 645
  Call by value VS Call by Reference     해킹잘하고싶다
01/15 443
3   쉘코드 모음     해킹잘하고싶다
01/15 960
2   리눅스 커널 2.6 버전 이후의 LKM     jdo
07/25 216
     [공지] 강좌를 올리실 때는 말머리를 달아주세요^ㅡ^ [29] 멍멍 02/27 18289
[1]..[71][72][73][74][75][76][77][78] 79

Copyright 1999-2023 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com