我是靠谱客的博主 忐忑过客,最近开发中收集的这篇文章主要介绍《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. 存储类别、链接
序号 | 存储类别 | 作用域 | 链接 | 声明方式 |
---|---|---|---|---|
1 | auto 自动 | 块 | 无 | 块内默认 |
2 | register 寄存器 | 块 | 无 | 变量前用关键字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*
序号 | 函数名 | 作用 |
---|---|---|
1 | fopen(filename,model) | 打开文件 |
2 | fclose(FILE*) | 关闭文件 |
3 | EOF | 文件结尾,-1 |
4 | fprintf(FILE*,string,parameter) | 写入文件 |
5 | fscanf(FILE*,string,parameter) | 从文件中读取内容到parameter |
6 | fgets(buf,len,fp) | 读取len-1个字符,或者遇到换行符、文件结尾 |
7 | fputs(buf,fp) | 把buf输入到fp文件 |
8 | fseek(fp,offset,model) | model确定起点位置,SEEK_SET文件开始处,SEEK_CUR当前位置,SEEK_END文件末尾,成功返回0,失败-1 |
9 | ftell() | 成功返回当前位置,ftell(fp)可以获得fp文件的字节数 |
10 | fgetpos(fp,pos)/fsetpos(fp,pos) | fseek的增强版,fseek只能操作小文件,这个能操作更大的文件 |
11 | fflush(fp) | 刷新缓冲区 |
12 | fwrite/fread(str,size,num,fp) | 二进制读写,从str中读num个size大小的内存到fp文件中,或从fp读到str |
13 | feof(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. 位操作
- 符号
~:取反
& | ^ 与 或 异或
- 掩码
MASK=0x02
flags = flags & MASK
使用 MASK 中的 0 掩藏 flags 中的相应位
- 打开位
MASK=0x02
flags = flags | MASK
使用 MASK 中的 1 打开 flags 中的相应位
- 关闭位
MASK=0x02
flags = flags & ~MASK
使用 MASK 中的 1取反后 关闭 flags 中的相应位
- 切换位
MASK=0x02
flags = flags ^ MASK
flags中对应 MASK 中的 为1的位置的数全部改变,1变为0,0变为1
- 检查位
MASK=0x02
(flags & MASK)==MASK
检查 flags 中的某位或某几位是否为1
- << 左移 右移>>
- 位字段
主要是在结构体中声明位大小
struct {
int a:1;
int b:1;
}
本来应该占8字节,现在只占4字节,因为对齐原则,一个int至少4字节,但只使用了2位,其他的30位为0,不使用
9. 预处理器
- #include,#ifdef,#ifndef //常见就不用强调了
- #if,#elif,#else,#endif //和if else 差不多,也是后面跟判断条件
- #define
不推荐使用
若定义变量,可以用const
若想用宏函数,可以用内联
若想定义类型,可以用typedef
还有一些加 ## 的骚操作,,,感觉不是很必要,需要的时候再看吧
- #undef //取消宏
- #line和#error
1. 预定义宏有 __FILE__,__DATE__,__LINE__,__TIME__。字面意思
2. #line 可以改变__FILE__,__LINE__
3. #error 可以在编译期报错,放在#if等里面
- #pragma //编译器设置,例如可以改变struct的对齐字节数
10. C库
- 数学库 math.h
- 断言库 assert.h //调试的时候用
- string.h 中的memcpy(dest,src,n)和memmove(dest,src,n)的区别
传入参数的类别不同,memcpy假定两个字符串没有重叠,用register关键字声明
memmove没有这个限制,所以感觉memmove比较好用
- 通用工具库
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库所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复