博客
关于我
一招搞定“C语言声明式”类型的面试题
阅读量:121 次
发布时间:2019-02-26

本文共 3104 字,大约阅读时间需要 10 分钟。

C????????????????????????????????????????????????C??????????????????

C?????????

C?????????????????????????????????????????????????????????????????????????????????????????

  • ??????

    • ????????????
    • ??*?????
    • const?volatile???????????int?long????????????????????
  • ?????

    • ?????????????
    • ????????????????
    • ????????????
    • ????const?volatile???????????
  • ?????????

    ??1?char * const * p;

    • ?????
    • p???????????
    • ???????????char??????
    • p??????????????????

    ??2?char (* c[10])(int **p);

    • ?????
    • c?????10???????
    • ?????????????????????????????
    • ???????int????????char???

    ??????

    ????????????????????????????cdecl.c????C????????????????????????????????????

    ?????

    #include 
    #include
    #include
    #include
    #define MAXTOKENS 100#define MAXTOKENLEN 64enum type_tag { IDENTIFIER, QUALIFIER, TYPE };struct token { char type; char string[MAXTOKENLEN]; };int top = -1;struct token stack[MAXTOKENS];struct token this;#define pop stack[--top]#define push(s) stack[++top] = svoid gettoken() { char *s = this.string; while ((*s = getchar()) == ' ') { if (feof(stdin)) { *s = '\0'; break; } } if (isalnum(*s)) { push(this); while (isalnum(*s = getchar())) { *s = '\0'; } ungetc(*s, stdin); this.type = classify_string(); return; } if (*s == '*') { strcpy(this.string, "pointer to"); this.type = '*'; return; } this.string[1] = '\0'; this.type = *s; return;}void read_to_first_identifier() { gettoken(); while (this.type != IDENTIFIER) { push(this); gettoken(); } printf("%s is ", this.string); gettoken();}void deal_with_arrays() { while (this.type == '[') { printf("array "); gettoken(); if (isdigit(this.string[0])) { printf("0..%d ", atoi(this.string) - 1); gettoken(); } gettoken(); printf("of "); }}void deal_with_function_args() { while (this.type != ')') { gettoken(); } gettoken(); printf("function returning ");}void deal_with_pointers() { while (stack[top].type == '*') { printf("%s ", pop.string); }}void deal_with_declarator() { switch (this.type) { case '[': deal_with_arrays(); break; case '(': deal_with_function_args(); break; } deal_with_pointers(); while (top > 0) { if (stack[top].type == '(') { pop; gettoken(); deal_with_declarator(); } else { printf("%s ", pop.string); } }}int main() { read_to_first_identifier(); deal_with_declarator(); printf("\n"); return 0;}

    ????

    ?????????????????

    char * const * p;char (* c[10])(int **p);

    ???????????

    p is pointer to function returning pointer to charc is array of 10 pointers to function returning pointer to char, function takes pointer to pointer to int and returns pointer to char

    ??

    ???????????????????????????C????????????????????????????????C?????????????????????????????????????????????????????

    ????????????????Expert C Programming??????????????????????????????????????????????????????

    转载地址:http://ldqu.baihongyu.com/

    你可能感兴趣的文章
    PIP使用SSH从BitBucket安装自定义软件包,无需输入SSH密码
    查看>>
    pip命令提示unknow or unsupported command install解决方法
    查看>>
    pip在安装模块时提示Read timed out
    查看>>
    pip更换源
    查看>>