노는게 제일 좋습니다.
7회차 : 함수 호출 방식, 전처리기 본문
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 가 나온다.
'C' 카테고리의 다른 글
9회차 : 표준함수 (0) | 2017.02.11 |
---|---|
8회차 : 기억부류(스토리지 클래스) (0) | 2017.02.08 |
6회차 : 함수의 구성 원리, 헤더 파일 (0) | 2017.02.03 |
5회차 : 기타 연산자, 연산 규칙 (0) | 2017.02.02 |
4회차 : 산술,논리 연산자 (0) | 2017.01.31 |