함수 포인터
double integrate(double (*f) (double), double a, double b);
double integrate(double f(double), double a, double b);
result = integrate(sin, 0.0, PI / 2);
함수 포인터는 함수들의 인자로서 유용함뿐만 아니라 데이터를 가리키는 포인터들과 같이 다룰 수 있다.
함수 포인터들을 변수에 저장할 수 있거나 배열의 원소들로서 사용할 수 있으며, 구조체나 공용체의 멤버로서도 사용할 수 있다.
void (*pf)(int);
pf = f; // f is a function and no need '&'
(*pf)(i); // call f
pf(i); // call f same as (*pf)(i);
함수 포인터들이 원소인 배열은 여러가지에 응용할 수 있다.
void (*file_cmd[])(void) = {new_cmd,
open_cmd,
close_cmd,
close_all_cmd,
save_cmd,
save_as_cmd,
save_all_cmd,
print_cmd,
exit_cmd
};
(*file_cmd[n])(); // or file_cmd[n]();
Restricted Pointers
int * restrict p;
int * restrict q;
p = malloc(sizeof(int));
q = p; // legal
*q = 0 // undefined behavior 발생
p와 q는 같은 객체를 가리키고 있다. -> *p와 *q를 aliases라 한다.
void *memcpy(void * restrict s1, const void * restrict s2, size_t n);
void *memmove(void *s1, const void *s2, size_t n);
void *memcpy(void *s1, const void *s2, size_t n);
void *memmove(void *s1, const void *s2, size_t n);
C99버전의 memcpy의 프로토타입에서 restrict의 사용은 프로그래머에게 s1과 s2가 overlap하지 않는 객체를 가리켜야하는 것을 알려주거나 아니면 함수의 동작을 보장하지 않는다.
restrict는 컴파일러에게 좀 더 효율적인 코드를 생산할 수 있게 정보를 제공한다.(최적화, optimization)
출처: K.N.KING C PROGRAMMING A MODERN APPROACH