博客
关于我
一招搞定“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/

    你可能感兴趣的文章
    php如何优化压缩的图片
    查看>>
    php如何做表格,新手怎么制作表格
    查看>>
    RabbitMQ高级特性
    查看>>
    php如何定义的数位置,php如何实现不借助IDE快速定位行数或者方法定义的文件和位置...
    查看>>
    RabbitMQ集群 - 普通集群搭建、宕机情况
    查看>>
    php如何正确的获得文件的后缀名
    查看>>
    PHP如何生成唯一的数字ID
    查看>>
    PHP如何获取当前页面的最后修改时间
    查看>>
    PHP如何读取json数据
    查看>>
    PHP字符串
    查看>>
    PHP字符串递增
    查看>>
    php学习之基础语法
    查看>>
    RabbitMQ集群 - 仲裁队列、Raft协议(最详细的选举流程)
    查看>>
    PHP学习总结(11)——PHP入门篇之WAMPServer多站点配置
    查看>>
    PHP学习总结(12)——PHP入门篇之变量
    查看>>
    PHP学习总结(13)——PHP入门篇之常量
    查看>>
    PHP学习总结(14)——PHP入门篇之常用运算符
    查看>>
    PHP学习总结(1)——PHP入门篇之PHP可以做什么?
    查看>>
    PHP学习总结(2)——PHP入门篇之PHP代码标识
    查看>>
    PHP学习总结(3)——PHP入门篇之PHP的echo语句
    查看>>