함수에 대한 포인터 질문좀

kldpgk의 이미지

함수 포인터 사용하여 호출하는 소스인데

#include <stdio.h>

double square (double x);  //함수 원형 

double (*p) (double x);    // 포인터 선언 

main()   

{
 
 p= square;   //p가 square 가르키도록 초기화 한것..

 printf ("%f %f\n", square(6.6), p(6.6)); //6.6이 의미 하는게 뭔지. 
 return(0);
}

 double square (double x) // 정의   , p=square에서 불러온거져?
{
 return x*x;   //여기서 x의 값이 먼지 모르겟네여 
}

답은 똑같이 43.55999
간단한 소스 같은데 처음이라 봐도 봐도 모르겟네여

hurricanepark의 이미지

저도 함수포인터에 대해서 잘 모르지만 몇자 적어보겠습니다.
포인터 변수는 많이 보셨을거에요. 포인터 변수는 동일한 타입의 여러번수를
이것도 주소값가져다가 사용하고 저변수주소값 가져다가 사용하고 하잔아요..
함수 포인터도 타입은 일치하고 이름이 다른 함수들을 이것도 붙여서 사용하고 저것도 붙여서 사용하고싶을때 쓴다고 하더라구요.
예를 들어서 a를 입력하면 +연산을 b를 입력하면 -연산을 할수있는 메뉴를 만들고 싶다면 +,-연산을 하는 동일한 타입의 함수를 두개만들고요 a가 입력되면 +연산을 하는 함수의 이름(주소)를 연결해주고요 -연산을하면 -연산을 하는 함수랑 연결해주는 식으로 써먹는다고 들었거든요.

오늘 하루두 즐거운 하루였으면 좋겠습니다.

ole2000의 이미지

6.6이 의미하는건 함수에 전달되는 인수값이죠..

Be cool...

익명 사용자의 이미지

1) 6.6 * 6.6 즉 6.6의 제곱을 구하는 것입니다.
2) p= square; 는 말그대로 square()의 주소값만 p에 저장해준것임(초기화)
호출(실행)은 p(정수) 형태로 불리어야 함
3) return x*x는 입력된 파라메터 즉, 더블 x를 곱해서 그 결과를 리턴함

* square는 전형적으로 제곱을 구하는 함수명으로 널리 사용됨(영문뜻 그대로,... 때로는 sqr()정도로 사용되기도 함. 그러나, 그거야 오야맘.

kldpgk의 이미지

Anonymous wrote:
1) 6.6 * 6.6 즉 6.6의 제곱을 구하는 것입니다.
2) p= square; 는 말그대로 square()의 주소값만 p에 저장해준것임(초기화)
호출(실행)은 p(정수) 형태로 불리어야 함
3) return x*x는 입력된 파라메터 즉, 더블 x를 곱해서 그 결과를 리턴함

* square는 전형적으로 제곱을 구하는 함수명으로 널리 사용됨(영문뜻 그대로,... 때로는 sqr()정도로 사용되기도 함. 그러나, 그거야 오야맘.

]

그럼여 6.6의 값이 7.7이면 답이 변하겟군여 ..??

(야릇하게.. 햇갈리네여 (역시 전 바보인가 봅니다))

IsExist의 이미지

함수 이름 자체는 해당 함수의 시작 주소를 가리키는 lvalue 아 아닌 변수 입니다.

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

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

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

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

addnull의 이미지

다른 질문입니다만,
합수 포인터는 디바이스 드라이버 작성할때 자주 쓴다고 얼핏 들었습니다.
그때말고 자주 쓰는 또다른 경우가 있나요?

문법상으로 알고 있어도
도통 써먹어 본적이 있어야죠.. (경험 부족이라서 그럴지도.. 0_0;; )

2006년 2월 21일.

jongwooh의 이미지

어니스트 wrote:
다른 질문입니다만,
합수 포인터는 디바이스 드라이버 작성할때 자주 쓴다고 얼핏 들었습니다.
그때말고 자주 쓰는 또다른 경우가 있나요?

문법상으로 알고 있어도
도통 써먹어 본적이 있어야죠.. (경험 부족이라서 그럴지도.. 0_0;; )

2006년 2월 21일.

프로그래머 수준에서 다이내믹 라이브러리를 만들 필요가 있을 때 유용하게 쓸 수 있습니다. (런타임에 호출될 지점을 if문의 사용 없이 변경할 수 있는 유용한 기능이죠.) 최초의 C++ 구현은 컴파일러가 아니라 C 소스로 변환해주는 컨버터로 만들어졌는데, 그 구현 방식이 함수 포인터를 이용하는 것이었습니다.

도스 시절에는 그래픽 출력 루틴을 프로그래머가 짜는 경우가 허다했는데, 그때는 구현하다 보면 함수 포인터가 아주 유용한 경우가 많았거든요. 하지만 요즘의 VC/VC++ 환경에서는 모든 I/O를 거의 모두 시스템이 제공해주니 거의 함수 포인터를 쓸 일이 없는게 정상적일겁니다.

you must know the power of dark side.

addnull의 이미지

jongwooh wrote:
프로그래머 수준에서 다이내믹 라이브러리를 만들 필요가 있을 때 유용하게 쓸 수 있습니다. (런타임에 호출될 지점을 if문의 사용 없이 변경할 수 있는 유용한 기능이죠.) 최초의 C++ 구현은 컴파일러가 아니라 C 소스로 변환해주는 컨버터로 만들어졌는데, 그 구현 방식이 함수 포인터를 이용하는 것이었습니다.

도스 시절에는 그래픽 출력 루틴을 프로그래머가 짜는 경우가 허다했는데, 그때는 구현하다 보면 함수 포인터가 아주 유용한 경우가 많았거든요. 하지만 요즘의 VC/VC++ 환경에서는 모든 I/O를 거의 모두 시스템이 제공해주니 거의 함수 포인터를 쓸 일이 없는게 정상적일겁니다.

아.. 그렇군요.
감사합니다. :D

2006년 2월 21일.

skyul의 이미지

보통 C 라이브러리 만들 때는 콜백을 등록하는 용도로 많이 쓰죠.

예를 들어 PNG 같은 라이브러를 보면, 이미지 디코딩할 때 내부적으로 malloc을 써버리면, 다른 서브 시스템이랑 붙일 때 메모리 관리자가 달라서 문제가 될 수도 있기 때문에, 메모리 관리자의 함수 포인터를 받도록 하는거죠.

--
서광열 소프트웨어 블로그: http://skyul.tistory.com 입니다.

wafe의 이미지

윈도우즈에서도 콜백을 많이 쓰죠. 콜백 함수 포인터를 API에 넘기는 경우가 많습니다.

그리고 함수 기반으로 상태 기계를 구현할 때도 쓸 수 있을 것 같은데... 이건 클래스 기반 상태 기계가 더 나으니 별로 쓸모 없겠군요.

Heejoon Lee

shockyhan의 이미지

jongwooh wrote:
어니스트 wrote:
다른 질문입니다만,
합수 포인터는 디바이스 드라이버 작성할때 자주 쓴다고 얼핏 들었습니다.
그때말고 자주 쓰는 또다른 경우가 있나요?

문법상으로 알고 있어도
도통 써먹어 본적이 있어야죠.. (경험 부족이라서 그럴지도.. 0_0;; )

2006년 2월 21일.

프로그래머 수준에서 다이내믹 라이브러리를 만들 필요가 있을 때 유용하게 쓸 수 있습니다. (런타임에 호출될 지점을 if문의 사용 없이 변경할 수 있는 유용한 기능이죠.) 최초의 C++ 구현은 컴파일러가 아니라 C 소스로 변환해주는 컨버터로 만들어졌는데, 그 구현 방식이 함수 포인터를 이용하는 것이었습니다.

도스 시절에는 그래픽 출력 루틴을 프로그래머가 짜는 경우가 허다했는데, 그때는 구현하다 보면 함수 포인터가 아주 유용한 경우가 많았거든요. 하지만 요즘의 VC/VC++ 환경에서는 모든 I/O를 거의 모두 시스템이 제공해주니 거의 함수 포인터를 쓸 일이 없는게 정상적일겁니다.


포토샵이나 애프터이펙트처럼 응용 프로그램에서 플러그인을 구현하거나 효과필터 등을 구현할 때, 동적인 메뉴를 지원해야 할 때 씁니다.
호스트 프로그램은 함수 포인터를 호출하도록 코딩하고, 플러그인 개발자가 필요한 기능을 작성하도록 하는 거죠.

===========================================================================
Shocky Han
BIM Consultant, Certified Information Systems Auditor
Seoul, Korea.
===========================================================================

mach의 이미지

1) Stevens의 UNP 초판을 보면 라이브러리를 쭉~ 구축한 후, trivial ftp를 구현한 chapter가 있습니다.
어떤 유한상태머신(Finite State Machine)을 만들고 구현하다 보면, 함수 포인터가
참 유용하구나 하는 생각이 들기도 합니다.

2) 동적라이브러리를 이용할 경우라면, 자연스럽게 함수 포인터가 등장하기 마련입니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

z4ch4ri4h의 이미지

앞서 말씀하신 DLL과 CALLBACK뿐만아니라

간단하게 주위만 살펴봐도 STL의 여러 알고리즘에서도 쓰이고
(for_each부터 시작해서 비교,정렬 알고리즘등등)

C라이브러리중에선 qsort()같은 애들이 크기비교를 위해 사용하죠 :)

라이브러리에서 변할수있는 일부기능을 사용하는측에 떠맡길(?)경우 유용하게 쓰이네요 :)

cyberpd의 이미지

상태값 이나 넘어온 인자에 따라 함수 호출해야하는 경우 일일이 비교하여 함수 호출하기 귀찮아서 다음 처럼 합니다.

콘솔구현이나 상태기계 구현등에 편하더군요.

namespace STATUS
{
	enum ESTATUS
	{
		NONE=0,
		STATUS1,
		STATUS2,
		STATUS3,
		STATUS99
	};
}
//---------------------------------------------------------------------------

typedef void (*_func_ptr)(void*, unsigned int);

void ProcessStatus1(void* _data, unsigned int _size) { /* ...*/ }
void ProcessStatus2(void* _data, unsigned int _size) { /* ...*/ }
void ProcessStatus3(void* _data, unsigned int _size) { /* ...*/ }
void ProcessStatus4(void* _data, unsigned int _size) { /* ...*/ }
void ProcessStatus99(void* _data, unsigned int _size) { /* ...*/ }

void Test(void* _data, unsigned int _size) { /* ...*/ }

std::map<int,_func_ptr> StatusFunctionMap;
void InitializeStatusFunctionMap(void)
{
   StatusFunctionMap[STATUS::STATUS1]=&ProcessStatus1;
   StatusFunctionMap[STATUS::STATUS2]=&ProcessStatus2;
   StatusFunctionMap[STATUS::STATUS3]=&Test;
   StatusFunctionMap[STATUS::STATUS99]=&ProcessStatus99;
}
//---------------------------------------------------------------------------

void UpdateStatus(STATUS::ESTATUS _current_status, void* _data, unsigned int _size)
{
   if(_current_status==STATUS::NONE) return;
   
   if(StatusFunctionMap.find((int)_current_status)!=StatusFunctionMap.end())
   {
	  StatusFunctionMap[(int)_current_status](_data,_size);
   }
}
//---------------------------------------------------------------------------

-= 우주인류감시위원회 =-

익명 사용자의 이미지

z4ch4ri4h wrote:

...
라이브러리에서 변할수있는 일부기능을 사용하는측에 떠맡길(?)경우 유용하게 쓰이네요 :)

이러한 유형을 system call과 대비하여 up-call 이라고 부릅니다. open system적인 측면을 강조할때도 널리 사용되겠습니다. 확장성등등에도 이용되겠습니다.
전형적인 유형중 하나가 active-x스타일 com,등이겠지요.

댓글 달기

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