C 함수 기본 - sonkoni/Koni-Wiki GitHub Wiki
== 정의 ==
void 함수이름(void) { 반환형 함수이름(void) { 반환형 함수이름(매개변수) {
코드 return 반환값 return 반환값
} } }
== 호출 ==
함수이름(); 반환형 = 함수이름(); 반환형 = 함수이름(매개변수);
함수를 사용할 때 인자를 넣으면, 함수의 매개변수에 값(value)이 할당된다. 복사로 이뤄지는 것이다. 마찬가지로, 반환값이 있을 경우 그것도 Value 로 Copy 된다.
#include <stdio.h>
┌─────────────────────┐
▼ │
int hello(int a) { │ a = k 가 된다.
┌── return a * 2; │ 즉, a 변수의 스토리지에 10이 복사된다.
│ } │
│ │
│ int main(int argc, char *argv[]) { │
│ int k = 10; │
└────▶ int y = hello(k); ──────────────┘
반환값 20이 y에 복사된다.
printf("=> %d\n", y);
return 0;
}이는 포인터를 통해 확인하면 좀더 명확하다.
참조(reference)로 전달되는 것이 아니라 value 가 copy 된 것이다.
#include <stdio.h>
┌────────────────────────┐
▼ │
void hello(int *a) { │ a = &k 가 된다.
printf("a => addr : %p\n", &a); │ `k`의 value 는 27 이지만
printf("a => value: %p\n", a); │ `&k`의 value 는 0x7ff7b08755cc 이다.
printf("a => deref: %d\n", *a); │ 즉 int *a 변수에 0x7ff7b08755cc 가 복사된다.
┌─────── *a = 10; │ 그래서 a 의 value 는 0x7ff7b08755cc 이 된다.
│ } │
│ │
│ int main(int argc, char *argv[]) { │
│ int k = 27; │
│ printf("k => addr : %p\n", &k); │
│ printf("k => value: %d\n", k); │
│ hello(&k); ─────────────────────────┘
├─────── printf("RESULT: %d\n", k);
│ return 0;
│ }
│
│ k => addr : 0x7ff7b08755cc ───┐
│ k => value: 27 ├─ k와 a는 서로 별개이다.
│ a => addr : 0x7ff7b08755a8 ───┘ 그러나 a는 k의 주소를 복사하고 있다.
│ a => value: 0x7ff7b08755cc ───────────────┘
│ a => deref: 27 따라서 *a 로 역참조하면 k의 value에 접근할 수 있다.
└──▶ RESULT: 10 그래서 *a 에 새로운 값을 할당하면 k의 value가 바뀐다.C는 위에서 아래로 소스크드를 해석해 나간다. 함수를 사용하려면 미리 정의되어 있어야 하는 것이다. 그래서 함수 정의를 나중에 작성하고 싶다면 일단 함수 원형만 먼저 선언해주고, 나중에 함수를 정의 해주면 된다.
#include <stdio.h>
void hello(int a);
int main(int argc, char *argv[]) {
int k = 27;
hello(k);
return 0;
}
void hello(int a) {
printf("=> %d\n", a);
}
=> 27