第八~十三章

第八~十三章

第八章

  • 考虑下面的数组声明:

    int a[] = {4, 9, 1, 8, [0]=5, 7};
    

    编译器在处理初始化式列表时,会记录下一个待初始化的数组元素位置。正常情况下,下一个元素是刚被初始化元素后面的那个。但是当列表中出现初始化式时,下一个元素会被强制为指示符对应的元素,即使该元素已经被初始化过了。

    所以最终效果与下面的声明一样:

    int a[] = {5, 7, 1, 8};
    

第九章

  • 函数定义
    • 如果省略返回类型,C89假定为int类型,在C99中是非法的。
  • 函数声明
    • 函数声明可以放在另一个函数体内
  • C99中在调用一个函数之前,必须先对其进行声明或定义
  • 变长数组的形参
    • 一维

      int sum_array(int a[], int n);
      int sum_array(int n, int a[n]);
      int sum_array(int n, int a[*]);
      int sum_array(int, int [*]);
      int sum_array(int, int []);
      int sum_array(int n, int a[]);
      
    • 二维

      int sum_two_dimensional_array(int n, int m, int a[n][m]);
      int sum_two_dimensional_array(int n, int m, int a[*][*]);
      int sum_two_dimensional_array(int n, int m, int a[][m]);
      int sum_two_dimensional_array(int n, int m, int a[][*]);
      
  • 数组参数声明中使用static
    • 下例中,将static放在数字3之前表明数组长度至少可以保证是3

      int sum_array(int a[static 3], int n)

    • 如果数组是多维的,static仅可用于第一维

  • 复合字面量
    • 复合字面量是通过指定其包含的元素而创建的没有名字的数组
    • 格式:先在一堆圆括号内给定类型名,随后在一对花括号内设定所包含元素的值

第十二章

表达式 含义
*p++*(p++) 自增前表达式值是*p,以后再自增p
(*p)++ 自增前表达式值是*p,以后再自增p
*++p*(++p) 先自增p,自增后表达式的值是*p
++*p++(*p) 先自增*p,自增后表达式的值是*p

第十三章

  • strlen的精简史

    size_t strlen(const char *s) {
        size_t n;
        for (n = 0; *s != '\0'; s++) {
            n++;
        }
        return n;
    }
    

    n的初始化移到声明,*s != '\0'*s != 0是一样的,测试*s != 0*s是一样的

    size_t strlen(const char *s) {
        size_t n = 0;
        for (; *s; s++) {
            n++;
        }
        return n;
    }
    

    同一个表达式中对s进行自增,并测试*s是可行的

    size_t strlen(const char *s) {
        size_t n = 0;
        for (; *s++;) {
            n++;
        }
        return n;
    }
    

    while语句替换for语句

    size_t strlen(const char *s) {
        size_t n = 0;
        while (*s++) {
            n++;
        }
        return n;
    }
    

    看起来精简很多,但事实上速度根本没提升,至少对于一些编译器下面的版本确实会快一点

    size_t strlen(const char *s) {
        const char *p = s;
        while (*s++) 
            ;
        return s - p;
    }
    

    速度的提升得益于不需要在while循环中对n进行自增

  • 搜索字符串结尾

    while (*s++) 
        ;
    
    while (*s) 
        *s++;
    

    注意两个版本结束时s指向的位置

  • 字符串复制

    while (*s++ = *p++) 
        ;
    

    循环在赋值空字符后停止,不需要单独添加空字符

  • C89规定,编译器必须最少支持509个字符长的字符串字面量(没错,就是509,不要怀疑);C99是4095个字符

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容