● 함수 포인터의 이해
- 함수는 cpu에 의해 실행이 된다.
> 결국은 메인 메모리 영역에 함수가 있어야 한다.
- 함수이름도 실행시, 의미를 지닌다.
> 메모리에 존재시, 함수이름은 메모리상의 위치를 가리키는 포인터다.
> 결론 : 함수이름은 포인터다
- main함수의 main도 의미를 지닌다.
ex)
int Fuction(int a, int b) {...}
int main(void) {Funtion(10, 20);...}
// Funtion란 이름의 포인터가 가리키는 메모리 공간에 존재하는 메함수를 호출 하라
// 10, 20 란 값을 메모리상에 올린다.
● 함수 타입
- 함수 포인터 : 주소 + 자료형(타입)
- 함수포인터 타입을 결정짓는 요소 : 리턴타입 + 매개 변수 타입
> int fct(int a) ====> int (*fptr)(int);
- (*fptr)는 리턴타입이 int 이고 인자값이 int형인 포인터이다
- fptr : 변수, fct : 상수
- fct(10) : fct 라는 포인터가 가리키는 메모리 공간에 가르키는 함수 호출
- P(10); // 가능
> double fct2(double a, double b) ====> double(*fPtr2)(double, double);
- double (*p)(double, double) 함수를 가리키는 변수
- 차이점 : fct2는 상수, p는 변수
예제 ) ================================================================================
#include <stdio.h>
void Add(int a, int b);
void ChPrint(char* str);
int main(void)
{
char * string = "This is a Function Pointer";
int a = 10;
int b = 20;
void (*fPtr)(int, int) = Add;
void (*fPtr_1)(char* str) = ChPrint;
fPtr(a, b); // == Add(a, b);
fPtr_1(string); // == ChPrint(str);
/*
printf("%d, %d \n", Add, fPtr1); // 출력결과는 같다.
// 결과적으로 가지는 값은 같다.
// 함수포인터로 초기화 되었기 때문에, 같은 주소값이 출력
*/
return 0;
}
void Add(int a, int b)
{
printf("%d + %d = %d \n", a, b, a+b);
}
void ChPrint(char* str)
{
printf("str = %s \n", str);
}
======================================================================================
● void형 포인터랑 무엇인가?
- 주소값을 저장할수 있는 메모리 공간
- 다만, 주소값을 저장할수 있는 제한이 없다.
> ex) int* a; // int형만 가리킨다.
char* ch; // char 형만 가리킨다.
void* v; // 모든 타입을 가리킬수 있다.
- 자료형에 대한 정보가 제외된, 주소 정보를 담을 수 있는 형태의 변수
- 포인터 연산, 메모리 참조와 관련된 일에 활용 할수 없다.
int main(void)
{
char c = 'b';
int number = 10;
void *p ;
p = &c;
p = &n;
}
int main(void)
{
int n = 10;
void * vp = &n; // OK!
*vp = 20; // Error!... 몇바이트를 참조해야할까?(void형 포인터는 연산, 메모리 참조 불가)
// 타입정보가 없음-> 메모리 참조X (활용 : malloc 라는 동적 할당에서 다루겠음)
vp++; // Error!...
...
}
중요 예제 ) =============================================================================
// main_1.c
#include <stdio.h>
int main(int argc, char** argv)
{
int i = 0;
printf("전달된 문자열의 수 : %d \n", argc);
for(i=0; i<argc; i++)
printf("%d번째 문자열 : %s \n", i+1, argv[i]);
return 0;
}
<그 림 이 해>
// c:\> main_1
// main함수 호출전에 입력한 main_1 문자열을 메모리공간에 올려 문자열 상수로 올린다.
// 이 문자열 주소값을 배열에 저장한다.
// 이 배열은 char형 포인터로 구성
// main함수의 매개변수를 위와 같이 한다면
// 생성된 문자열의 개수를 인자로 전달한다.
// 두번째 인자는 argv는 char* 의 주소값으로 전달
// argv -> 문자열의 주소값을 보관하고 있다.
// 입력시 프로그램의 실행파일이 (도스에서) 실행된다.
// c:\Exam에 실행파일이 있다고 가정
// c:\Exam> main_arg abcd 10234 // 문자열이 3개
// argc = 3
// arr[0] -> "main_arg"
// arr[1] -> "abcd"
// arr[2] -> "10234"
// 도스창내에서 문자열을 구분하는 것은 '공백'
// "abcd 1234" 이렇게 큰 따음표를 하면 하나의 문자로 인식
====================================================================================
'컴퓨터공학 기초 > C.C++' 카테고리의 다른 글
cout 출력 포맷 설정하기 (0) | 2011.07.28 |
---|---|
쓰레드(pthread_create, pthread_join) (0) | 2011.04.03 |
assert (0) | 2010.12.12 |
문자열 검색 함수 - strchr(), strrchr(), strstr(), strspn(), strcspn(), strpbrk() (0) | 2010.10.11 |
copy()와 특별한 이터레이터 (0) | 2010.10.08 |