[참고]조금 난해한 포인터 예제

익명 사용자의 이미지

하다보니 조금 난해해 졌군요.

공부하시는데 조금이나마 도움이 되었으면 좋겠군요 ^^;

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);
}

익명 사용자의 이미지


헉.... 이런......

제가 알기론..

아래 두개만 맞고 나머지 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);

도 성립하겠죠?

그럼 열심히 내공 쌓으시고...다음에 뵙죠 ^^;

익명 사용자의 이미지

김경태 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) 이라고 인식해주는군요..
일반 포인터에 대해선 바로 에러 납니다...

그다지 맘에 들지 않는 부분이군요...

익명 사용자의 이미지

음.. ps1(1,2,3) 이라는것이 원래 맞는건데요..ㅡㅡ;
제가 잠시 착각 했습니다.

(*ps1)(1, 2, 3 ) 가 좀잘못된건데 컴파일러는 특별히 함수포인터
에대해선 ps1(1,2,3) 이라고 인식해주는군요..
일반 포인터에 대해선 바로 에러 납니다...

그다지 맘에 들지 않는 부분이군요...

두 가지 모두 대등하게 옳습니다..

문법적만으로 따지자면 (*ps1)(1,2,3)이 더 옳겠지요..

하지만 함수명 자체가 주소이고

또한 함수포인터가 가지고 있는 값도 해당 함수의 주소이므로

ps1(1,2,3)과 같이 해야 옳다고 하는 사람들도 많아서

두 가지 모두 C표준에 속합니다.

익명 사용자의 이미지


ㅡㅡ;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.