我是靠谱客的博主 忐忑过客,最近开发中收集的这篇文章主要介绍《C Primer Plus》(第六版)进阶学习1. 字符串处理2. 存储类别、链接3. 内存管理4. ANSI C 限定符5. 文件操作函数 FILE*6. struct、union、enum7. typedef与#define8. 位操作9. 预处理器10. C库,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. 字符串处理

1. gets(str)/puts(str)
2. fgets(str,len,stdin)/fputs(str,stdout)
3. strlen(str)
4. strcat(s1,s2)/strncat(s1,s2,n)   //strcat无法检测s1是否能容纳s2,strncat加上n字节的限制
5. strcmp(s1,s2)strncmp(s1,s2,n)    //只比较前n位
6. strcpy(s1,s2)/strncpy(s1,s2,n)
7. strchr(str,c)/strrchr(str,c)  //在字符串中找字符位置,第二个是倒着找
8. strstr(s1,s2)           //在字符串中找子串位置

2. 存储类别、链接

序号存储类别作用域链接声明方式
1auto 自动块内默认
2register 寄存器变量前用关键字register
3静态无链接块内的static
4静态内部链接文件内部全局static
5静态外部链接文件外部全局变量,不加static
1. extern 说明
    extern 只是变量声明,表明这个变量已经在其他文件中定义过了。
    用extern声明的变量不能再定义。
2. auto 关键字
    C 中的 auto 和C++ 中的完全不一样
    C 中的是存储类别声明
    C++ 中是自动类型
3. 自动即放到栈上,静态即放到数据段,动态放到堆段

3. 内存管理

1. malloc(size)
2. calloc(n,size)
    二者参数不同。且calloc初始化申请的空间为0,而malloc不初始化
3. relloc
3. free

4. ANSI C 限定符

1. const   //常量限定,注意常量指针和指针常量
2. volatile //声明不能被编译器优化
3. restrict //只能用于指针,告诉编译器该指针是访问数据的唯一且初始的方式,可以被优化
4. _Atomic  //原子操作限定,相当于资源锁了,但是只是可选实现,编译器不一定支持,不建议使用

5. 文件操作函数 FILE*

序号函数名作用
1fopen(filename,model)打开文件
2fclose(FILE*)关闭文件
3EOF文件结尾,-1
4fprintf(FILE*,string,parameter)写入文件
5fscanf(FILE*,string,parameter)从文件中读取内容到parameter
6fgets(buf,len,fp)读取len-1个字符,或者遇到换行符、文件结尾
7fputs(buf,fp)把buf输入到fp文件
8fseek(fp,offset,model)model确定起点位置,SEEK_SET文件开始处,SEEK_CUR当前位置,SEEK_END文件末尾,成功返回0,失败-1
9ftell()成功返回当前位置,ftell(fp)可以获得fp文件的字节数
10fgetpos(fp,pos)/fsetpos(fp,pos)fseek的增强版,fseek只能操作小文件,这个能操作更大的文件
11fflush(fp)刷新缓冲区
12fwrite/fread(str,size,num,fp)二进制读写,从str中读num个size大小的内存到fp文件中,或从fp读到str
13feof(fp)/ferror(fp)检测是到文件尾返回的EOF还是出错返回的EOF

6. struct、union、enum

1. 注意struct成员是数组还是指针的问题
    若是数组,存的是数组的大小
    若是指针,存的是地址,地址指向其他地方,若要使用,记得用malloc
2. 结构体的对期问题
3. union 中多种类型只占一份空间,可用来判别大端小端
4. enum 枚举,为了增加程序的可读性,最好只使用,不要对其进行算术运算,不推荐只用

7. typedef与#define

1. typedef只能用于类型
2. typedef由编译器解释,#define由预处理器处理

8. 位操作

  1. 符号
~:取反
& | ^ 与 或 异或
  1. 掩码
MASK=0x02
flags = flags & MASK
使用 MASK 中的 0 掩藏 flags 中的相应位
  1. 打开位
MASK=0x02
flags = flags | MASK
使用 MASK 中的 1 打开 flags 中的相应位
  1. 关闭位
MASK=0x02
flags = flags & ~MASK
使用 MASK 中的 1取反后 关闭 flags 中的相应位
  1. 切换位
MASK=0x02
flags = flags ^ MASK
flags中对应 MASK 中的 为1的位置的数全部改变,1变为0,0变为1
  1. 检查位
MASK=0x02
(flags & MASK)==MASK
检查 flags 中的某位或某几位是否为1
  1. << 左移 右移>>
  2. 位字段
主要是在结构体中声明位大小
struct {
    int a:1;
    int b:1;
}
本来应该占8字节,现在只占4字节,因为对齐原则,一个int至少4字节,但只使用了2位,其他的30位为0,不使用

9. 预处理器

  1. #include,#ifdef,#ifndef //常见就不用强调了
  2. #if,#elif,#else,#endif //和if else 差不多,也是后面跟判断条件
  3. #define
不推荐使用
若定义变量,可以用const
若想用宏函数,可以用内联
若想定义类型,可以用typedef
还有一些加 ## 的骚操作,,,感觉不是很必要,需要的时候再看吧
  1. #undef //取消宏
  2. #line和#error
1. 预定义宏有 __FILE__,__DATE__,__LINE__,__TIME__。字面意思
2. #line 可以改变__FILE__,__LINE__
3. #error 可以在编译期报错,放在#if等里面
  1. #pragma //编译器设置,例如可以改变struct的对齐字节数

10. C库

  1. 数学库 math.h
  2. 断言库 assert.h //调试的时候用
  3. string.h 中的memcpy(dest,src,n)和memmove(dest,src,n)的区别
传入参数的类别不同,memcpy假定两个字符串没有重叠,用register关键字声明
memmove没有这个限制,所以感觉memmove比较好用
  1. 通用工具库
1. qsort(s1,s2,mycompare);  //自己写比较函数
2. exit()   //退出
3. atexit(函数名) //在exit执行前,退出前执行某个函数,若注册多个函数,是按照栈的方式注册的,即后面注册的先执行。

最后

以上就是忐忑过客为你收集整理的《C Primer Plus》(第六版)进阶学习1. 字符串处理2. 存储类别、链接3. 内存管理4. ANSI C 限定符5. 文件操作函数 FILE*6. struct、union、enum7. typedef与#define8. 位操作9. 预处理器10. C库的全部内容,希望文章能够帮你解决《C Primer Plus》(第六版)进阶学习1. 字符串处理2. 存储类别、链接3. 内存管理4. ANSI C 限定符5. 文件操作函数 FILE*6. struct、union、enum7. typedef与#define8. 位操作9. 预处理器10. C库所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部