C 함수 기본 - sonkoni/Koni-Wiki GitHub Wiki

함수 사용

== 정의 ==
void 함수이름(void) {       반환형 함수이름(void) {       반환형 함수이름(매개변수) {
    코드                       return 반환값             return 반환값
}                         }                         }

== 호출 ==
함수이름();                 반환형 = 함수이름();          반환형 = 함수이름(매개변수);

함수는 value 로 전달한다.

함수를 사용할 때 인자를 넣으면, 함수의 매개변수에 값(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
⚠️ **GitHub.com Fallback** ⚠️