노는게 제일 좋습니다.

7회차 : 함수 호출 방식, 전처리기 본문

C

7회차 : 함수 호출 방식, 전처리기

노는게 제일 좋습니다. 2017. 2. 7. 02:07

1. 값 호출 방식

void main()
{
 int i, j;

 i = 5;
 j = sqrNum(i);
 printf("i=%d, 결과=%d\n", i, j);
}

int sqrNum(int a)
{
 a = a*a;
 return a;
}

sqrNum에서 아무리 a를 바꿔도 i값은 바뀌지 않는다.

이 경우 main함수에서 sqrNum(i);라는 구문을 통해 값 5를 sqrNum함수에 전달했다.

변수 i의 주소를 전달한 것이 아니다.

다시 말하면 sqrNum내의 형식매개변수 a에 i값을 대입한다는 것은, 새로운 변수 a를 선언해 단순한 값 5를 할당한 것이다.


2. 참조 호출 방식

void main()
{
 int i, j;
 i = 5;
 j = sqrNum(&i);
 printf("i=%d, 결과=%d\n", i, j);
}
int sqrNum(int *a)
{
 *a = *a**a;
 return *a;
}

sqrNum을 호출할 떄 i의 주솟값을 넘겨준다. 이 경우, a의 값을 수정하면 i값도 수정된다.

i와 a 모두 같은 메모리 번지를 가리키기 때문이다.

이와 같이 인수를 넘겨 호출하는 것을 참조 호출이라고 한다.


다만 엄밀한 의미의 참조 호출이라고 할 수 없는 것이, C는 언제나 값만 전달한다.

참조 호출은 포인터변수가 갖는 번지값으로 실인수를 조작하는 흉내를 통해 나타나는 효과이다.

편의상 포인터를 통한 참조 호출이라고 부른다.


3. 인수의 종류

- 입력용 인수 : 어떤 함수의 호출원으로부터 입력되는 인수. 초기화 필요

  예 : printf("%d", a); 에서의 a

- 출력용 인수 : 함수가 호출되어 결과를 뱉는 인수.

  예 : scanf("%d", &a); 에서의 a, void example(int *a, int *b); 에서의 a와 b.

- 입출력용 인수 : 호출원으로부터 입력받는 용도로도, 결과를 뱉는 용도로도 사용. 참조 호출해야한다.

  예 : 2번 항목의 int sqrNum(int *a)


4. 전처리기

컴파일 이전에 처리되는 항목들이다. 아래 5번부터는 모두 전처리기의 설명이다. 


5. #include 문

헤더, 텍스트, 소스코드 파일 등을 포함시킨다.

헤더를 포함하는 경우, #include<abc.h>의 꼴이면 표준 헤더이고, #include "abc.h"의 꼴이면 사용자 정의 헤더이다.

근데 같은이름의 헤더가 없으면 안지켜도 그닥 상관은 없다. 알아서 잘 찾는다.

#include "hihi\abc.h"와 같이 다른 경로에 있는 파일도 불러올 수 있다.


6. #define 문

#define FIVE 5

FIVE라는 매크로 상수를 5라는 값으로 정의. 그냥 변수 쓰듯 쓰면 됨

#define sqr(i) ((i)*(i))

sqr(i)라는 매크로 함수를 ((i)*(i))로 정의

왜 i를 하나하나 감싸냐면, sqr(2+1)로 호출했을 때 반환값이 3*3=9가 안나오는 이상한 일이 발생할 수 있기 때문이다.

#define sqr(i) (i*i)로 작성한 뒤, sqr(2+1)과 같은 모양새로 호출하면, 2+1*2+1=5 가 나온다.

Comments