complex C 구문의 의미
중복 가능:
이 C 문장은 무엇을 의미합니까?
이 표현은 무슨 뜻입니까?
char *(*c[10])(int **p);
c
는 a를 반환하는 10개의 함수 포인터의 배열입니다.char*
그리고 a를 가져갑니다.int**
논변으로
(*c[10])
^^^^ = array of 10
(*c[10])
^ = function pointer
그래서 지금 우리는 10개의 함수 포인터 배열을 가지고 있습니다.
char *(*c[10])
^^^^^^ = returns a char*
char *(*c[10])(int** p)
^^^^^ = takes a int** as an argument
a를 반환하는 10개 함수 포인터 배열char*
그리고 a를 가져갑니다.int**
논변으로
참고: 이런 식으로 코드를 쓰면 뺨을 맞을 만합니다.
cdecl은 번역하기 좋은 도구입니다.C
횡설수설하며 영어로 말하다
$ cdecl explain 'char * (*c[10]) (int **)'
declare c as array 10 of pointer to function (pointer to pointer to int) returning pointer to char
몇 가지 예와 decl을 사용하는 끝의 토막글.
1. 함수에 대한 포인터:
void (*foo)(void);
당신에게 함수 포인터를 줄 것입니다.foo
매개변수를 사용하지 않고 아무것도 반환하지 않습니다.
Ex. A:
void fun_1(void)
{
...
}
foo = fun_1;
foo(); /* this would call fun_1() */
예: B:
char (*bar)(int);
당신에게 함수 포인터를 줄 것입니다.bar
1개의 매개변수를 정수로 취하고 a를 반환합니다.char
.
char fun_2(int x)
{
if (x == 50)
return 'a';
return 'Z';
}
char v;
bar = fun_2;
v = bar(50); /* this would call fun_2() with 50 as parameter and return 'a' */
2. 포인터를 가리킵니다.
int **p;
는 int 유형의 포인터를 가리키는 포인터입니다.
Ex. C:
int y[3] = {4, 3, 6};
int *w = &y[0];
int **z = &w;
printf("print: %d ", **z);
printf("%d ", *++(*z));
printf("%d\n", *(*z+1));
print: 4 3 6
3. 포인터를 반환하는 함수
예:
char *zez(char *s)
{
s = "def";
return s;
}
char *str = "abc";
printf("%s - ", str);
printf("%s\n", zez(str));
abc - def
4. 포인터를 반환하는 함수에 대한 함수 포인터
에 대한 함수 포인터 만들기zez()
예:
char *(*ptr_zez)(char *);
ptr_zez = zez;
printf("ptr: %s - ", str);
printf("%s\n", ptr_zez(str));
ptr: abc - def
5. 함수 포인터 배열, 함수가 문자 포인터를 반환하고 문자 포인터를 사용합니다.
예: F:
char *(*c[10])(char *);
c[0] = zez;
printf("c[0]: %s - ", str);
printf("%s\n", c[0](str));
c[0]: abc - def
6. "함수에 대한 포인터(int에 대한 포인터)의 cas 배열 10을 문자로 선언합니다."
char *cumlade(int **p)
{
char *c;
int i;
if ((c = malloc(sizeof(char) * 7)) == NULL) {
fprintf(stderr, "Unable to reserve 7 bytes\n");
exit(0);
}
for (i = 0; i < 6; ++i) {
c[i] = (unsigned char)*(*p+i);
}
c[6] = '\0';
return c;
}
int main(void)
{
int t[3][3] = {{97 ,98, 99}, {100, 101, 102}};
int *u = &t[0][0];
int **v = &u;
char *ex;
char *(*c[10])(int **p); /* <-- the fun */
c[0] = cumlade;
c[1] = cumlade;
ex = c[0](v);
printf("EX: %s\n", ex);
free(ex);
ex = c[1](v);
printf("AX: %s\n", ex);
free(ex);
return 0;
}
EX: abcdef
AX: abcdef
c
는 의 배열입니다.10
함수에 대한 포인터 포인터를 포인터로 이동int
해당 매개 변수로서 포인터를 반환합니다.char
.
형식 선언에는 배열이라는 세 가지 연산자가 포함됩니다.[SIZE]
, 포인터*
기능.(type1 param1, type2 param2, ...)
. 세 연산자 모두가 연관성이 있다는 것을 기억하세요.
char *(*c[10])(int **p);
연관성을 보다 명확하게 하기 위해 괄호를 더 추가해 보겠습니다.
char *((*(c[10]))(int *(*p)))
시작부터c
, 변수
c[10]
"c는 10개 원소의 배열이지만, 각 원소는..."을 의미합니다.
그럼 다음을 보세요.*
그 옆에*(c[10])
"c는 10개의 원소의 배열이고, 각 원소는 ...을 가리키는 포인터입니다."를 의미합니다.
그리고나서(*(c[10]))(int *(*p))
"c는 10개 요소의 배열이고, 각 요소는 함수에 대한 포인터이며, 이것은...을 반환한다"는 의미입니다. 비슷한 방법을 사용하면 함수가 "인트에 대한 포인터"인 하나의 파라미터를 취한다는 것을 알 수 있습니다.
그리고나서*((*(c[10]))(int *(*p)))
는 "c는 10개의 요소의 배열이고, 각 요소는 함수에 대한 포인터이며, 포인터를 ...로 반환합니다."를 의미합니다.
마침내.char *((*(c[10]))(int *(*p)))
는 "c는 10개 요소의 배열이고, 각 요소는 함수에 대한 포인터이며, 이는 char에 대한 포인터를 반환한다."를 의미합니다.바로 그겁니다.
나는 시계방향/나선 규칙이 매우 유용하다고 생각합니다.http://c-faq.com/decl/spiral.anderson.html 참조
하지만 나는 나선형을 사용하는 것보다 괄호를 더 많이 추가하고 싶습니다.
좋아요, 이제 당신이 가지고 있는 답은 함수 포인터의 배열입니다. 하지만 이런 코드를 쓸 수 있는 깨끗한 방법이 있나요?네, 있습니다. 이 코드는 언뜻 이해할 수 있을 것입니다.
typedef char *(*weirdFuncPtr)(int **p);
weirdFuncPtr funcPtrArray[10];
그건 그렇고 나는 보통 typedefs를 피합니다 - 함수 포인터를 선언할 때 사용합니다.이것은 이런 종류의 C 코드를 이해하기 쉽게 만듭니다. (C는 Cryptic의 줄임말이죠?)
함수 포인터의 배열을 선언합니다.배열에는 10개의 요소가 있습니다(선언문의 c[10] 부분부터).이 포인터들이 가리키는 함수는 char*를 반환하고 오직 하나의 매개변수, 즉 정수(int **p)에 대한 포인터를 사용합니다.
이 질문에 대한 첫 번째 답변 기능 포인터 배열을 사용하려면 어떻게 해야 합니까?함수 pointer 배열을 선언하는 또 다른 예를 찾을 수 있으며 혼란을 끝낼 수도 있습니다.
만약 당신이 이에 대한 직관적인 설명을 원한다면, http://www.geeksforgeeks.org/archives/16841 .
이에 대해 표현식 평가와 마찬가지로 사후 수정 순서 평가를 이용해 설명했습니다.
언급URL : https://stackoverflow.com/questions/9817734/meaning-of-complex-c-syntax
'source' 카테고리의 다른 글
워드 프레스로 기본 날짜 형식 가져오기 (0) | 2023.10.27 |
---|---|
Oracle에서 열 값 스와핑 (0) | 2023.10.27 |
헤더 파일을 포함하여 external과 #를 사용하는 것의 차이점은 무엇입니까? (0) | 2023.10.22 |
Symfony 2 / Dectrine에서 ENUM을 활성화하는 방법 (0) | 2023.10.22 |
ID가 짝수인 행을 선택 (0) | 2023.10.22 |