source

complex C 구문의 의미

manysource 2023. 10. 22. 20:11

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);

당신에게 함수 포인터를 줄 것입니다.bar1개의 매개변수를 정수로 취하고 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