luce in altisBLUE SKY

category Photo

Blog


포인터 선언 방법

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());  // 이 함수 포인터가 가리키는 함수 호출
}

'게임 > 프로그래밍' 카테고리의 다른 글

라이센스 이야기  (0) 2009.02.20
Scaleform  (0) 2009.01.07
Ganged Mode와 Unganged Mode  (0) 2008.11.21
호출 규약  (0) 2008.06.13
진공탄도 방정식  (0) 2008.05.08