관리 메뉴

IT 컴퓨터공학 자료실

초급편 6. 함수 호출 방법 본문

컴퓨터공학/포인터

초급편 6. 함수 호출 방법

윤맨1 2015. 6. 30. 11:09

                                           포인터 토대가 된 책

                                               함수 호출 방법

함수 호출에는 두 가지 방법이있다. "값 전달"며 "참조 전달"이다. 하청 함수에 인자로 변수 값을 전달하거나 변수의 주소를 전달 함수의 내부에서 간접 참조 하느냐에 따라 구별되고있다. C 언어의 기본 함수 호출은 "값 전달"하지만 쉽게 "참조 전달"할 수있다. 참조로 전달하기 위해 포인터를 인자로 넘기면된다. 문자열이나 배열을 하청 함수에 전달하려면 기본적으로 참조로 전달된다.

void sub1 (char * s)   / * 문자열의 참조로 전달 * /
{
.........
}

void sub2 (int * a)   / * 배열의 참조로 전달 * /
{
.........
}

void sub3 (int x)    / * 일반 값 전달 * /
{
        x = x + 1;
}

void sub4 (int * x)   / * 변수의 참조로 전달 * /
{
        * x = * x + 1;
        / * (* x) +; 같은 * /
}

void main ()
{
        char str [] = { "text"};
        int array [4] = {1, 2, 3, 4};
        int x = 10;

        sub1 (str);
        sub2 (array);
        sub3 (x);
        sub4 (& x);
}
(프로그램 6-1)

하청 함수 내에서 값을 변경했을 때 위의 함수에서 그 변수의 값이 변경되는지 여부라는 점에서 값 전달의 경우 변경되지 않지만, 참조로 변경되는 것에주의.

연산자 우선 순위에 대한 관심. 증가 (++) / 감소 (- -) 연산자와 간접 참조 연산자 (*)의 우선 순위는 간접 참조가 더 낮다. 그래서,

while (1) {
        sub (* + p);
}

이라는 코드는 빈출하지만 단일 문장

* + p;

간접 참조의 문장이 무의미하다. (포인터 p 증가 한 후 포인터가 나타내는 값을 참조하고 값을 버린다) 이것을 유사 어셈블리로 작성하면

MOV AX, [p의 주소
ADD AX 1
MOV BX, AX]

그리고, 결국 BX 레지스터의 값을 사용하지 않는 것이다.

참조에 의한 전달 함수 내부에서 증가 연산자를 사용하기 위해서는,

+ (* p);

할 필요가있다. 이것을 유사 어셈블리로 작성하면

MOV AX, [p의 주소
MOV BX, AX]
ADD BX 1
MOV [p의 주소, BX

되고, 포인터가 가리키는 주소의 값이 가산된다.



'컴퓨터공학 > 포인터' 카테고리의 다른 글

초급편 8. 리스트 구조  (0) 2015.06.30
초급편 7. 구조체와 포인터  (0) 2015.06.30
초급편 5. 포인터의 형태  (0) 2015.06.30
초급편 4. 주소 가져오기  (0) 2015.06.30
초급편 3. 문자열 처리  (0) 2015.06.30