포인터 2

함수 부분에서 포인터를 넘겨 함수 밖의 원소를 수정한 것을 기억합니까? 여기에서는 함수에 인자로 포인터를 넘기는 것과 함수의 포인터를 다루도록 하겠습니다.

#include <stdio.h>
void func(int* a) {
      ++(*a);
}
int main() {
      int k = 4;
      func(&k);
      printf("k: %d\n", k);
      return 0;
}

k: 5

아까 보았던 코드입니다. func 함수가 받고 있는 것은 k의 주소입니다. 물론 '주소라는 값' 자체는 복사되지만, k는 복사되지 않습니다. func 함수에서는 *연산자를 통해 a가 가리키는 곳, 즉 main 함수의 k에 접근할 수 있습니다.

같은 방법으로, 배열을 함수에 넘겨주는 것도 가능합니다.

#include <stdio.h>
void func1(int* p) {
      printf("%X\n", p);
      for(int i = 0; i < 5; ++i)
            printf("%d ", p[ i ]);
      printf("\n%d\n", sizeof p);
}
void func2(int p[]) {
      printf("%X\n", p);
      for(int i = 0; i < 5; ++i)
            printf("%d ", p[ i ]);
      printf("\n%d\n", sizeof p);
}
int main() {
      int arr[ 5 ] = { 1, 2, 3, 4, 5 };
      printf("%X\n", arr);
      for(int i = 0; i < 5; ++i)
            printf("%d ", arr[ i ]);
      printf("\n%d\n", sizeof arr);
      func1(arr);
      func2(arr);
      return 0;
}

61FE10
1 2 3 4 5
20
61FE10
1 2 3 4 5
8
61FE10
1 2 3 4 5
8

하지만 주의하세요, func1func2가 진짜로 받은 것은 arr 배열이 아니라 단지 배열의 시작 주소입니다.

자, 여기까지 읽었으면 지금껏 포인터에 관련된 부분이라며 건너뛰었던 내용들을 모두 이해할 수 있을 것입니다. 복습할 겸, 다시 처음으로 가서 ★이 있는 문장들을 주의 깊게 읽고, 이해하십시오.

함수를 가리키는 포인터를 만들 수도 있습니다. 함수 반환값의 자료형 (*이름)(인자)의 형식으로 만듭니다.

#include <stdio.h>
void func1(int a, int b) {
      printf("a: %d, b: %d\n", a, b);
}
int func2(int a) {
      printf("퉤에에엣\n");
      return a + 1;
}
void func3() {
      printf("GIRL Is Recursion Lover\n");
}
void func4() {
      printf("BOY is Object-oriented programming Yearner\n");
}
int main() {
      void (*fp1)(int, int) = func1;
      int  (*fp2)(int)      = func2;
      void (*fparr[ 2 ])()  = { func3, func4 };
      fp1(2017, 2018);
      printf("%d\n", fp2(2018));
      fparr[ 0 ]();
      fparr[ 1 ]();
      return 0;
}

a: 2017, b: 2018
퉤에에엣
2019
GIRL Is Recursion Lover
BOY is Object-oriented programming Yearner

이것도 함수의 인자로 넘겨줄 수 있고,

#include <stdio.h>
void func1(int p) {
      printf("%d\n", p);
}
void (*func2(int a, int b))(int) {
      printf("%d %d\n", a, b);
      return func1;
}
int main() {
      func2(1, 2)(3);
      return 0;
}

1 2

3

함수의 반환값으로 사용할 수도 있습니다. 아, 너무 복잡하니 typedef로 줄여달라고요?

#include <stdio.h>
typedef void (*func_p)(int);
void func1(int p) {
      printf("%d\n", p);
}
func_p func2(int a, int b) {
      printf("%d %d\n", a, b);
      return func1;
}
int main() {
      func_p (*fp)(int, int) = func2;
      func2(1, 2)(3);
      fp(4, 5)(6);
      return 0;
}

1 2

3

4 5

6

네, 해드렸습니다. 열심히 갖고 놀아보세요.