복잡한 포인터 문제..어떻게 해결하죠...

happyman의 이미지

char (*(*x[5])())[10]
이런 포인터의 뜻은 어떻게 되나요...
도저히 모르겠어요. :oops:

서지훈의 이미지

보아하니 함수 포인터인거 같은데...-_-ㅋ
개인적으로 이런 복잡한거 별로 안좋앟는데...

이거 사용한 예제코드랑 같이 보면은 해석은 더 쉬울거 같네요.
그리고 제가 함수 포인터를 실제 코드에 사용해본적이 없어서 더더 난해하게 보이네요..-_-ㅋ

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

체스맨의 이미지

happyman wrote:
char (*(*x[5])())[10]
이런 포인터의 뜻은 어떻게 되나요...
도저히 모르겠어요. :oops:

배열의 포인터 char (*)[10]를 리턴하는 함수 포인터의 배열입니다.

typedef char (*ca10)[10];
typedef ca10 (*func)();

위 typedef 된 func 의 5개짜리 배열이 x 입니다.

Orion Project : http://orionids.org

onemind555의 이미지

그런 포인터는 사용 되지도 않습니다.. 사용 한다면 사용 하는 사람이 이상 한 거겠죠...

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

체스맨의 이미지

onemind555 wrote:
그런 포인터는 사용 되지도 않습니다.. 사용 한다면 사용 하는 사람이 이상 한 거겠죠...

일단, 함수 포인터의 배열은 많이 사용됩니다.
단지 저렇게 읽기 어렵게 사용은 잘 안하고 typedef 를 쓰죠.

그리고, 그 함수가 무엇을 리턴하느냐 문제인데,
저것보다 읽기 더 까다로운 건, 함수 포인터를 리턴하는 함수입니다.
대표적으로 signal 함수가 그렇죠.

아무튼 저렇게 사용한다고 해서 이상한 사람은 아닙니다. :)

Orion Project : http://orionids.org

happyman의 이미지

일단 대충 해석했습니다.
char (*(*x[5])())[10] ;

typedef char (* NEWTYPE )[10] //리턴형은 char 형배열[10]에대한 포인터.

NEWTYPE (*x[5])();
(리턴형이 char형배열[10]에대한 "포인터"인~~~~) 함수포인터 5개가 있는 배열.

맞는지 확인좀 해주세요. :cry:

happyman의 이미지

K&R책에 나오는 예제입니다...

char (* (*x()) [])();

typedef char (* XXX [])()
리턴형은, char를 리턴하는 함수포인터의 배열

XXX (*x()) ===>
리턴형이 XXX에대한 포인터인 함수.
즉...!
char형을 리턴하는 함수포인터의 배열에대한! 포인터를 리턴하는 함수..

char * y() ; 가 char형 포인터를 리턴하는 함수인것처럼...!!~

이제야 조금 감이 잡히는군요.
위에분 말씀데로 typedef를 쓰니까 훨씬 편하네요..
아무튼 잘못된 부분 알려주세요. :D

신승한의 이미지

http://www.eskimo.com/~scs/C-faq/q1.21.html
도움되시길 바라겠습니다.

kksir의 이미지

변수를 중심으로 해석(?) 해 줍니다.
x는 그냥 변수입니다.
오른쪽으로 읽어서 x는 배열입니다.
그런데 그 배열에 무엇이 들어있냐 주소가 들어있습니다.
즉 배열 각각의 원소 5개가 모두 주소입니다.
헌데 그 원소 5개는 각각 주소인데 바로 함수를 가르킵니다.
그 함수는 포인터를 리턴값으로 갖는 함수입니다.
그 리턴되는 포인터 주소는 역시 배열이며 그 배열은 캐릭터 형을
가르킵니다.

The C programming Language 의 123 페이지를 보면
해석하는 방볍이 나와있으니 참고하시기 바랍니다.

오랜만에 보았더니 ㅡㅡㅋ

::::::::::: Easy come, Different go.
::::::::: Http://www.geekstep.org

happyman의 이미지

답변감사해요.
그런데...선언은 대충은 하겠는데..실제로 사용을 어떻게 해야하는지 모르겠네요.

char (*(*x[5])())[10] ; 이렇게 선언한다음에 x[0] , x[1]에 원소를 넣고싶은데

그 원소가 되는것이 char형 배열을 리턴하는 함수의 포인터가 되어야하니....
이렇게 저렇게 해봤는데 안되네요..아래것도 안되고...
char[] * t1()
{
}
질문의 요지는 char형 배열에대한 포인터를 리턴하는 함수를 어떻게 정의하는지 입니다..

정태영의 이미지

happyman wrote:

질문의 요지는 char형 배열에대한 포인터를 리턴하는 함수를 어떻게 정의하는지 입니다..

char* func( ... );

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

체스맨의 이미지

happyman wrote:
답변감사해요.
char (*(*x[5])())[10] ; 이렇게 선언한다음에 x[0] , x[1]에 원소를 넣고싶은데

질문에 답이 있습니다. :)

char (* f())[10]
{
	static char s[2][10];
	return s;
}

char (*(* x[5])())[10] = { f, f, f, f, f };

Orion Project : http://orionids.org

댓글 달기

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