티스토리 뷰

이전 글: 5. 다차원 배열과 포인터에서 계속



함수 포인터

변수만 메모리에 저장되는 것은 아니다.
함수들도 바이너리 형태로 메모리 공간에 저장되고, 호출 시 실행된다.
메모리 상에 저장된 함수의 주소 값을 저장하는 포인터 변수가 바로 '함수 포인터 변수'이다.

함수는 프로그램 실행 시 '메인 메모리'에 저장되어 실행되고,
함수의 이름도 함수가 저장된 메모리 공간의 주소 값을 의미한다.
(배열의 이름과 마찬가지로 함수의 이름도 그 형태가 상수이다)

함수 이름의 포인터의 형(type)은 반환형과 매개변수의 선언을 통해서 결정짓는다.
예: int SimpleFunc(int num) ==> 반환형이 int이고 매개변수로 int형 변수가 하나 선언된 포인터 형


함수 포인터 변수
int (*fptr) (int)
--- --------  -----
 A      B       C

A = 반환형이 int
B = 함수 포인터
C = 매개변수 선언이 int 하나

int Sum(int a, int b) { … }
int (*fptr) (int, int);
fptr = Sum;
fptr(1, 4); // 포인터로 함수를 호출할 수 있다 


void 포인터

void * ptr; // 형이 존재하지 않는 포인터로 무엇이든 담을 수 있다.
               // 하지만, 포인터 연산을 할 수 없고, 값의 변경이나 참조도 불가능하다. 
               // (가리키는 대상에 대한 어떤 형(type)정보도 담겨있지 않으므로)

일단 주소값에만 의미를 두고, 포인터 형은 나중에 결정하려는 의도.
메모리 동적 할당과 깊은 관계가 있다.


main 함수의 파라미터

int main(void) 또는 int main(int argc, char * argv[])

먼저, 1차원 배열의 이름(주소 값)을 인자로 전달받는 매개변수는 아래와 같이 정의된다.
void Func(TYPE * arr)
void Func(TYPE arr[])

캐릭터형 포인터 배열을 인자로 받는다면
void Func(char * arr[])
void Func(char **arr)


$ Func I Love You # 를 실행했다면. 

argc = 3
argv[0] = Func\0  // 함수 이름이고, 문자열이기 때문에 마지막에 \0가 포함된다.
argv[1] = I\0
argv[2] = Love\0
argv[3] = You\0
argv[4] = NULL

로 구성되고 실제로는,  main(4, argv) 처럼 호출된다.






반응형
댓글
공지사항