C언어 포인터 관련 질문

박은규@Google의 이미지

안녕하세요, 포너블 공부 막 시작한 학부생입니다.
C언어 포인터 관련해서 질문이 있어 글을 쓰게 되었습니다.

/* #1 */    void (*func)() = ...;
/* #2 */    
/* #3 */    char code[] = "\x31\x42...\x80";
/* #4 */    (void(*)() code)();

1. #1과 같이 선언한다면, 그 의미가
이름이 "func"인 (void *)()형, 즉 void형 함수를 가리키는 포인터를 선언한다.
라는 건가요?
2. #3과 같이 선언했을 때, #4의 의미가
이름이 "code"인 변수를 (void *)()형, 즉 void형 함수로 캐스팅하여 함수처럼 실행한다.
는 것인가요?

익명 사용자의 이미지

어느 정도 수준의 답을 바라는 것인지 모르겠네요.

미묘하게 부정확한 부분이 있기는 한데 대충 맞습니다.

freestyle의 이미지

void (*func)() = ...;

1. 이름을 찾습니다 => func
2. 가장 가까운 것(우선순위에 의해 먼저 평가 받는 것)을 봅니다 => *니까 포인터네요. func은 포인터입니다.
3. 다음은 ()네요 => 선언에서 포인터까지 읽었으면, 다음 읽는 것은 포인터가 가리키는 대상체입니다. func은 포인터인데, 함수를 가리키네요.
4. 마지막 void입니다. => 선언에서 함수까지 읽었으면, 다음 읽는 것은 리턴타입입니다. func은 포인터인데, 함수를 가리키고, 그 함수의 리턴타입은 void이네요.

정리하면 func은 void를 리턴하는 함수를 가리키는 포인터입니다.

1번에서 이름만 빼면, 타입이 되죠. 2번에서 code를 타입캐스팅 했고, ()는 실행문에서 함수실행을 의미하니 말씀하신 바가 맞습니다.

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

박은규@Google의 이미지

이해가 잘 되었습니다.

jachin의 이미지

저 소스코드가 컴파일 되는 컴파일러 옵션이 따로 있는 건가요?
아니면 오래된 버전의 컴파일러?

익명 사용자의 이미지

아하, 잠시 헷갈렸네요.

C언어의 cast operator는 (type) expression의 꼴이어야 하기 때문에 #4는 이렇게 써야 컴파일이 됩니다.
((void(*)()) code)();

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.