[참고]조금 난해한 포인터 예제
하다보니 조금 난해해 졌군요.
공부하시는데 조금이나마 도움이 되었으면 좋겠군요 ^^;
void *song[2];
int s1(int a, int b, int c);
int s2(int a, int b);
void main(void)
{
int a, b, c, d;
int (*ps1) (int, int, int);
int (*ps2) (int, int);
ps1 = s1;
ps2 = s2;
song[0] = (void *)ps1;
song[1] = (void *)ps2;
a = (*(int (*) (int, int, int)) song[0]) (1, 2, 3);
b = (*(int (*) (int, int)) song[1]) (1, 2);
c = ((int (*) (int, int, int)) song[0]) (1, 2, 3);
d = ((int (*) (int, int)) song[1]) (1, 2);
printf(" a %d \n", ps1(1, 2, 3));
printf(" b %d \n", ps2(1, 2));
printf(" real a %d \n", a);
printf(" real b %d \n", b);
printf(" c %d \n", c);
printf(" d %d \n", d);
}
int s1(int a, int b, int c)
{
return(a*b*c);
}
int s2(int a, int b)
{
return(a*b);
}
Re: [참고]조금 난해한 포인터 예제
헉.... 이런......
제가 알기론..
아래 두개만 맞고 나머지 4개는 틀린건데..
이상하게 에러가 안나네.. ㅡㅡ;??
더욱 이상한것은 그러면
printf(" d %d \n", (***ps1)(1, 2, 3)); 이것도 되네..ㅡㅡ;
이상하네........ 컴파일러 버근가???????????
printf(" a %d \n", ps1(1, 2, 3));
printf(" b %d \n", ps2(1, 2));
printf(" real a %d \n", a); <- 맞고
printf(" real b %d \n", b); <- 맞고
printf(" c %d \n", c);
printf(" d %d \n", d);
다 맞는데요.
님께서는 아마도 다음을 원하셨겠죠?
printf(" a %d \n", (*ps1)(1, 2, 3));
printf(" b %d \n", (*ps2)(1, 2));
원칙으로는 맞는 말이지만...제 프로그램도 틀린건 아닙니다.
ps1(1,2,3)이라도 써도 띨빵한(?) 컴파일러는 (를 보는 순간!
아 이건 함수를 가르키는구나..하고 인식을 한다는 거죠.
이걸 암시적 포인터 표현이라고 하더군요.
그런 이유로
c = ((int (*) (int, int, int)) song[0]) (1, 2, 3);
d = ((int (*) (int, int)) song[1]) (1, 2);
도 성립하겠죠?
그럼 열심히 내공 쌓으시고...다음에 뵙죠 ^^;
Re^3: 다 맞는데요.
김경태 wrote..
님께서는 아마도 다음을 원하셨겠죠?
printf(" a %d \n", (*ps1)(1, 2, 3));
printf(" b %d \n", (*ps2)(1, 2));
원칙으로는 맞는 말이지만...제 프로그램도 틀린건 아닙니다.
ps1(1,2,3)이라도 써도 띨빵한(?) 컴파일러는 (를 보는 순간!
아 이건 함수를 가르키는구나..하고 인식을 한다는 거죠.
음.. ps1(1,2,3) 이라는것이 원래 맞는건데요..ㅡㅡ;
제가 잠시 착각 했습니다.
(*ps1)(1, 2, 3 ) 가 좀잘못된건데 컴파일러는 특별히 함수포인터
에대해선 ps1(1,2,3) 이라고 인식해주는군요..
일반 포인터에 대해선 바로 에러 납니다...
그다지 맘에 들지 않는 부분이군요...
Re^4: 다 맞는데요.
음.. ps1(1,2,3) 이라는것이 원래 맞는건데요..ㅡㅡ;
제가 잠시 착각 했습니다.
(*ps1)(1, 2, 3 ) 가 좀잘못된건데 컴파일러는 특별히 함수포인터
에대해선 ps1(1,2,3) 이라고 인식해주는군요..
일반 포인터에 대해선 바로 에러 납니다...
그다지 맘에 들지 않는 부분이군요...
두 가지 모두 대등하게 옳습니다..
문법적만으로 따지자면 (*ps1)(1,2,3)이 더 옳겠지요..
하지만 함수명 자체가 주소이고
또한 함수포인터가 가지고 있는 값도 해당 함수의 주소이므로
ps1(1,2,3)과 같이 해야 옳다고 하는 사람들도 많아서
두 가지 모두 C표준에 속합니다.
Re^5: (x,.x)
ㅡㅡ;
댓글 달기