함수 매개변수에서..

miso210의 이미지

함수 매개변수로 다른 함수명을 넘겨 주는거랑 함수 포인터로 넘겨주는 거랑 차이점이 있나요.

일반변수로 넘겨주는거와 포인터로 넘겨주는 거랑 같은 이치인지 알고 싶습니다.

익명 사용자의 이미지

C 혹은 C++에 대해서 묻고 계신 거라 가정하겠습니다.

함수의 매개변수로 함수 자체를 직접 넘길 수는 없습니다. 모두 함수 포인터로 전달되는 것입니다.

다만 모든 함수이름은 함수 포인터로 자동 변환되므로 함수 포인터를 써야 되는 곳에 func_name으로 적어주던 &func_name으로 적어주던 같습니다.

또한 함수 호출시에도 함수 포인터에 굳이 *를 적어주지 않아도 가리키는 함수를 호출하는 것이 가능힙니다.


void func(void) { ... }

void (*func_p)(void);

func_p = func;    // 함수 이름은 함수 포인터로 변환된다. 따라서 &func로 써주지 않아도 상관없다.

func_p();    // 함수 포인터에 *을 붙이지 않아도 함수 호출이 가능하다.

이러한 특징 때문에 다음과 같은 함수 호출식도 가능합니다.

void func() { ... }

(*********************func)();

함수 이름은 함수 포인터로 변환되고, 함수 포인터는 *을 만나 함수 이름으로 변환되고, 다시 *을 만나서 함수 포인터로 변환되고... 이걸 계속 반복합니다.

다만 void (****func_pointer)(void);의 경우에는 (제대로 메모리 할당이 되어 있고 제대로 함수를 가리키고 있다는 가정 하에) 함수를 호출하기 위해서 최소한 4번의 *를 쓰지 않으면 안됩니다. 함수의 포인터는 함수를 호출하기 위해서 사용할 수 있지만 함수의 포인터의 포인터는 함수를 호출할 수 없습니다.

또한 &&func_name 은 틀린 수식입니다. 주소값에 대한 &라는 것은 아무런 의미가 없지요.

익명 사용자의 이미지

Anonymous wrote:

함수 이름은 함수 포인터로 변환되고, 함수 포인터는 *을 만나 함수 이름으로 변환되고, 다시 *을 만나서 함수 포인터로 변환되고... 이걸 계속 반복합니다.

정정합니다.

함수 이름은 함수 포인터로 변환되고, 함수 포인터는 *을 만나 함수 이름으로 변환되고, 다시 함수 포인터로 변환되고, 다시 *을 만나... 이걸 *가 다 소진될때까지 계속 반복합니다.

miso210의 이미지

정말로 큰 실수를 했네요 ^__^;

사용 언어는 C언어 입니다.

글 잘 읽었습니다.
그런데 문제의 책에는 함수 포인터를 선언하지 않고 그냥 일반함수로 정의 해서 그럼니다.

double g(double x);
double bisect(double f(double frarg) ) 


bouble bisect(double f(double farg) ) 
{
       return f(1.0)
}

int main(){
    ...
    root  = bisect(g);

}

그럼 함수 포인터를 선언 안하고 그냥 일반함수이름만 넘겨도 함수 포인터 역활을 하는 것인가요.

이제 시작이다.

IsExist의 이미지

함수 이름 자체가 그 함수의 위치를 나타내는 포인터 입니다.

배열 변수명이 첫번째 값의 주소를 나타내듯이요.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

miso210의 이미지

Quote:
함수 이름 자체가 그 함수의 위치를 나타내는 포인터 입니다.

그러면
double bisect(double f(double frarg) ) <--이게 아니라

double bisect(double (*f)(double frarg) ) <-- 이렇게 되야 되는거 아닌가요.

이 둘이 차이점이 있을거라 생각되는데요..

이제 시작이다.

익명 사용자의 이미지

Quote:

C99 6.7.5.3 Function declarators (including prototypes)

8 A declaration of a parameter as ‘‘function returning type’’ shall be adjusted to ‘‘pointer to function returning type’’, as in 6.3.2.1.

함수 선언(혹은 정의)의 매개변수 리스트에 있는 함수는 함수 포인터로 변환됩니다. 함수 선언의 매개변수 리스트에서 배열이 포인터형으로 변환되는 것과 비슷합니다.

익명 사용자의 이미지

miso210 wrote:
이 둘이 차이점이 있을거라 생각되는데요..

똑같은 의미를 가집니다. 뿐만아니라 선언에서는 f로 쓰고 정의에서는 (*f)로 (또는 그 반대로) 써도 됩니다. 내부적으로는 둘 다 (*f)로 받아들입니다.

익명 사용자의 이미지

Anonymous wrote:
다만 void (****func_pointer)(void);의 경우에는 (제대로 메모리 할당이 되어 있고 제대로 함수를 가리키고 있다는 가정 하에) 함수를 호출하기 위해서 최소한 4번의 *를 쓰지 않으면 안됩니다.

4번 이상이 아니라 3번 이상입니다.

댓글 달기

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