1. char *cities[10];
=> 포인터 배열(포인터가 배열 형태로 10개가 잡힘)
2. char (*cities)[10];
=> 배열 포인터 ( X행 10열짜리 배열을 가리킬 수 있는 배열 포인터)
3. char *(cities[10]);
=> 1번과 동일([ ] 가 우선순위가 더 높음)
4. char *(cities)[10];
=> 1번과 동일
5.double (*lines[5])[2];
=> X행 2열짜리 배열을 가리킬 수 있는 포인터가 배열로 존재(5개의 포인터 배열)
6. double (*arr)[5][2];
=> X면 5행 2열을 가리킬 수 있는 배열 포인터
7. char *city = "Busan";
=> "Busan" 이라는 문자열의 시작주소인 'B' 를 가리키는 포인터 변수
8. const char *city = "busan";
=> city 가 가리키는 대상체는 상수(수정불가)...즉,,,포인터 상수
9. char *const city = "Busan";
=> city 는 다른 대상체를 가리 킬 수 없슴...즉,,,상수 포인터
=> 그러나,,,"Busan" 문자열 자체가 정적 데이터 영역에 존재하는 read only 문자열이므로
=> 결국은,,,이 문자열 자체도 수정이 불가능...
10. const char *const city = "Busan";
=> city가 다른 주소값을 가리킬 수도 없고, city 가리키는 곳의 값을 수정도 할 수 없슴...
=>포인터 상수이면서, 상수 포인터
=> city 가 가리키는 곳은 문자열의 시작주소('B')
11. float *g(), (*h)();
=> g 는 매개변수가 없고, float * 타입을 리턴하는 함수
=> h 는 매개변수가 없고, float 타입을 리턴하는 함수를 가리키는 함수 포인터 변수
12. void ex(int, double (*)(int));
=> 매개변수로 int 타입과 double 형을 리턴하며 int 타입을 매개변수로 갖는 함수를 가리키는 함수 포인터
변수를 취하는 ex 함수...ex 의 리턴값은 없슴.
13. void (*p)(float,float,float (*)(float,float);
=> 매개변수: float 타입
float 타입
float 타입을 리턴하며, 2개의 float 타입을 매개변수로 받는 함수를 가리키는 함수 포인터 변수
=> p 는 리턴값이 없슴
=> 즉,,,p는 함수 포인터 변수
14. int (*(*p)())()
=> 자신의 매개변수는 없고, int __( ) 타입의 함수를 리턴 받을 수 있는 함수 포인터 변수
15. int (*func[5])();
=> int __( ) 타입의 함수를 가리킬 수 있는 함수 포인터 배열
16. char * const * const p;
=> 이중 포인터 p가 가리키는 일차원 포인터의 참조값만 수정이 가능
=> 즉,,,상수 포인터
17. const char * const * const p;
=> const 는 자신의 오른쪽 항을 상수화 시킴
=> p는 자신이 가리키는 일차원 포인터의 주소만을 가리킬 수 있고,
이 일차원 포인터도 처음에 가리키는 곳 외에는 다른 주소값을 가리킬 수 없슴.
18. void *p = new(double (*)[3];
=> p 는 X행 3열짜리 double 타입의 메모리를 할당받을 수 없슴...
=> p 는 1차원으로만 표현됨...
19. int atexit(void (*)(void));
=> void __( ) 형태의 함수를 가리킬 수 있는 함수 포인터 변수를 매개변수로 취하고, int 타입을 리턴하는
함수 atexit
20. void (*signal(int, void(*)(int))
=> 잘못된 함수타입임...
=> signal 함수는 매개변수로 int 타입과 void __(int) 형태를 취하는 함수를 가리킬 수 있는 함수 포인터 변수
를 매개변수로 갖고 있지만,,,이 signal 함수의 리턴될 함수의 매개변수 선언이 없는 상태임...
=> 올바른 형태:
예) void (*signal(int, void(*)(int)) ( );
다음의 설명에 따라 함수 원형을 작성하라
1. func1이라는 함수는 전달인자도 없고, 리턴 값도 없다.
=> void func1( );
2. func2라는 함수는 double전달 인자를 하나 받아서 int형을 반환한다.
=> int func2(double);
3. func3라는 함수는 int 참조를 전달인자로 받아서 char*를 반환한다
=> char* func3(int& );
4. func4라는 함수는 첫번째 인자로 구조체 Arff의 참조, 두 번째 인자로 구조체
Map의 참조, 세번째 인자로 int를 받아서, 구조체 Arffd의 참조를 반환한다.
func4는 첫번째 인자와 두번째 인자의 값을 변경하지 않는다.
=> Arffd& func4(const Arff&, const Map&, int);
5. func5라는 함수는 문자열 전달 인자를 받아서 int형을 반환한다.
단 func5함수는 전달받은 문자열을 변경하지 않는다.
=> int func5(const char* );
6. func6라는 함수는 위의 func4라는 함수의 포인터를 첫번째 인자로 받고,
double을 두 번째 인자로 받는다. 반환하는 값은 없다.
=> void func6(Arffd& (*)(const Arff&, const Map&, int), double);
7.func 이라는 함수는 위의 func4라는 함수의 포인터를 첫번째 인자로 받고,
위의 func6라는 함수의 포인터를 두 번째 인자로 받고, 위의 func5라는
함수의 포인터를 반환한다.
=> int (*func(Arffd& (*)(const Arff&, const Map&, int), void (*)(Arffd& (*)(const Arff&, const Map&,
int), double)) (const char*);
이해를 돕기 위해...
함수 포인터의 예)
int AA()
{
puts("AA");
return 10;
}
void BB()
{
puts("BB");
}
// 매개변수로 void __( ) 형태의 함수를 받고, int __( ) 형태의 함수를 리턴하는 함수 P
int (*P(void (*PTR)())) ( )
{
PTR();
return AA;
}
void main()
{
int (*pFunc)() = NULL; // 함수 포인터 변수
pFunc = P(BB); // 함수를 매개변수로 넘겨주고, 함수에 대한 포인터를 리턴 받음
printf("%d\n", pFunc()); // 이 함수 포인터가 가리키는 함수 호출
}