배열의 이름이 메모리의 주소 인 것처럼, 함수의 이름 역시 메모리의 주소이다.
하지만 함수의 이름은 코드가 저장된 메모리 주소로 쓰기를 수행할 수 없다.
함수 포인터는 함수의 이름을 저장하기 위한 포인터로 함수 호출 연산자의 피연산자가 될 수 있다. (함수 포인터로 인자로 사용해서 함수를 호출할 수 있다인 듯)
함수에 대해서 포인터 변수를 선언하는 형식: 반환_자료형 (*변수_이름)(매개변수_자료형);
#include <stdio.h>
02 :
03 : int TestFunc(int nData)
04 : {
05 : puts("TestFunc() - call");
06 : return 0;
07 : }
08 :
09 : void main(void)
10 : {
11 : int (*pfTestFunc)(int) = NULL ;
12 : pfTestFunc = TestFunc ;
13 : pfTestFun(10)
14 : }
15 :
<aside> 🙋🏻♀️ 막간을 이용한 ‘배열’ 복습 시간 !
int anData[4] = {1, 2, 3, 4};
이러한 배열이 존재할 때 anData[1]
와 *(anData + 1)
의 의미는 동일하다!
anData + 1
은 배열이 시작되는 주소에 1 만큼 옵셋하는 연산유사하게, anData
와 &anData[0]
은 같은 주소이다!
C언어에서 모든 문자열의 끝은 NULL(0) 입니다.
만일 크기가 12인 메모리에 12개의 영문자를 저장하면 총 13바이트의 메모리가 변경됩니다. 왜냐하면 맨 나중에 자동으로 NULL( 0 )이 추가되기 때문입니다. 이 때문에 마치「szName[12] = 0;」이 라는 코드가 실행되는 결과를 가져옵니다.
</aside>