C Primer Plus(二)
重读C Primer Plus ,查漏补缺
重读C Primer Plus,记录遗漏的、未掌握的、不清楚的知识点
分支和跳转
1、ctype.h头文件里包含了一些列用于字符判断的函数,包括判断数字、大小写字母,控制字符,可打印字符等一些列函数以及转换字母大小写的字符映射函数。
2、C99标准要求编译器支持至少127层if-else嵌套。
3、包含iso646.h头文件,可以使用and、or、not代替 &&、||、!,这是为了适应世界各地的键盘符号。
字符输入/输出和输入确认
4、 缓冲区分为完全缓冲和行缓冲,完全缓冲在缓冲区满时清空,行缓冲在遇到换行时清空,例如文件输入(完全)和标准输入(行),缓冲区大小取决于操作系统,512和4096字节是常见的值。
5、在多数Unix环境下,用[Ctrl+D]可以模拟产生一个文件尾信号,用以通知读取标准输入的程序已读取完,可能这也和交互模式下Python用这个快捷键关闭交互模式有关。
6、Unix下的重定向运算符,输入重定向<,输出重定向>,两个运算符可以组合使用。他们只可以连接可执行文件和数据文件,同类型不能连接,同时输入和输出不能重定向到一个以上的文件。
7、同时Unix还具有追加数据运算符>>,管道运算符 |,具体用法就要参照Unix相关书籍了,这并不是C的一部分。
函数
8、注意设置递归的结束条件,以及指针的用法,没有其余需要注意的内容。
数组和指针
9、C99标准支持初始化特定项目,如:
int arr[] = {,,,[]=}
未被初始化的项目都将被置为0。
10、 对于一个二维(多维)数组arr[n][m]而言,arr+1和arr[0]+1是不同的。
11、对于二维数组来说,arr时地址的地 址,要取两次值才可以得到通常的数值。
这里添一句题外话,在《C Primer Plus》第五版中,P267程序清单10.15的代码和代码输出
结果不一致,两个二维数组的下标写反了。
在输出中:
zippo[][] 应写为 zippo[][]
*(*(zippo+)+) 应写为 *(*(zippo+)+)
12、int (*arr)[2] 表示指向一个包含两个int的数组的指针;
int *arr[2] 表示包含两个int类型指针的数组,出现这个差别的原因在于运算符的结合性。
arr[m][n] 等价于 *(*(arr+m)+n)
13、对于N维数组,int arr[][10][20][30] 等价于 int (*ar) [10][20][30]
第一个方括号中可以不写,因为它将被认为是一个数组的指针,后面的数字则确定了具体的数据类型,必须填写。
14、C99标准支持变长数组,指维数可以用变量声明的数组,并不是维数可变,在函数参数中省略变量名时,应用星号代替维数,int sum(int, int, int [*][*]);
15、C99标准支持复合文字,例如(int [2])= {10, 20},因为是匿名变量,所以必须是声明时立刻使用,或者用指针保存其地址。目前还没用过这个特性。
字符串和字符串函数
16、用数组的方法初始化一个字符串时,数组尾部未被使用的内存全部被初始化为\0,并不是只有字符串结尾处被赋值\0。
17、char *m3 = "hello" 和 char m3[] = "hello" 在声明上作用几乎相同。不同的是,数组名是常量,无法修改其值,但指针是可以的。
这里又发现一处本书的错误:
P285中间偏下的位置 const char *m3[] = "....省略....." 应该为
const char *m3 = "....省略....."
18、对于char arr[m][n] 和 char* arr[] 来说,前者是一个字符串数组,也是一个矩形数组,而后者是一个字符串类型的指针数组,它其实也是矩形的,但其中存储的是地址,而字符串存储在程序用来存储常量的那部分,所以没有被浪费掉的空间,但是这些串是不能被修改的。
19、fgets函数相比gets更加安全,可以指定读入的数据长度,遇到换行符也同样读入,同时可以指定从哪一个文件读入,标准输入UNIX下可指定为stdin。
20、对于命令行中的参数,操作系统默认以空格划分一个个字符串,UNIX也允许使用引号把多个单词集中在一个参数里,例:
repeat "I am hungry" now
21、字符串转换为整数,常用atoi,还有atof,atol。复杂的有,strtol,strtoul,strtod,可以找出第一个非数字字符,并且可以转换相应进制,不常用。
存储类、链接和内存管理
22、对于具有文件作用域的变量(即通常所说的全局变量),static表明其链接类型维内部链接,只有这个文件中的函数可以访问这个变量。
23、五种存储类:
| 存储类 | 时期 | 作用域 | 链接属性 | 声明方式 |
| 自动 | 自动 | 代码块 | 空 | 代码块内 |
| 寄存器 | 自动 | 代码块 | 空 | 代码块内,使用关键字register |
| 具有外部链接的静态 | 静态 | 文件 | 外部 | 所有函数之外 |
| 具有内部链接的静态 | 静态 | 文件 | 内部 | 所有函数之外,使用关键字static |
| 空链接的静态 | 静态 | 代码块 | 空 | 代码块内,使用关键字static |
24、对于下列代码:
double *ptd = (double*) malloc ( * sizeof(double))
在C中,类型指派(double*)是可选的,但在C++中必须有,因此使用类型指派可使程序由C移植到C++更容易。
25、分配内存时,calloc函数接收两个参数,并且会将申请到的块内存全部置为0,但有些硬件系统浮点值并不全部用0表示。
26、一个位于*前的const使得指向的数据成为常量,位于*后的const使得指针成为常量。
27、restrict只能用来修饰指针,且这个指针指向的数据块由该指针初始且唯一访问,编译器会将根据这一点,对多条涉及这个指针的运算进行优化。
28、在C99标准下,有一些旧关键字可以出现在新的位置。
void fun(int a1[const], int a2[restrict], int n)
void fun(double ar[static ])
C Primer Plus(二)的更多相关文章
- C++Primer笔记二
真是一本好书,就这么点,就感觉学到很多了,当然也是我水平太差. 用shell或者bash的时候有一个文件重定向,就是每次程序运行的时候,我们都需要手动输入内容,然后程序输出内容,这时可以用文件来代替. ...
- c++primer记录(二) 模板
因为看得源码里有大量的类模板,所以补充下C++中模板的知识 模板:函数模板 类模板 .p- 函数模板的类型参数可由编译器进行推断,也可以由用户显式的指定,类模板的类型参数必须显式的给出: p- 非类型 ...
- C++Primer第5版学习笔记(二)
C++Primer第5版学习笔记(二) 第三章的重难点内容 这篇笔记记录了我在学习C++常用基本语法的学习过程,基本只记录一些重难点,对概念的描述不是一开始就详尽和准确的,而是层层深入 ...
- c++ primer读书笔记之c++11(二)
1 新的STL模板类型,std::initializer_list<T> c++11添加了initializer_list模板类型,用于提供参数是同类型情况的可变长度的参数传递机制,头文件 ...
- c++ primer plus 第6版 部分二 5- 8章
---恢复内容开始--- c++ primer plus 第6版 部分二 5- 章 第五章 计算机除了存储外 还可以对数据进行分析.合并.重组.抽取.修改.推断.合成.以及其他操作 1.for ...
- C++primer学习笔记(二)——Chapter 4
4.1 Fundamentals 1.Basic Concepts (1)操作符分为一元,二元或者三元操作符: (2)复杂的表达式中含有很多操作符时: 规则一:分为不同的级别,级别高的先运行: 规则 ...
- C++ Primer : 第十二章 : 文本查询程序
C++ Primer书上这个例子讲的很不错,写写帮助自己理解标准库和智能指针. .h 文件内容 #include <fstream> #include <iostream> # ...
- C primer plus 第五版十二章习题
看完C prime plus(第五版)第十二章,随带完成了后面的习题. 1.不使用全局变量,重写程序清单12.4的程序. 先贴出12.4的程序,方便对照: /* global.c --- 使用外部变量 ...
- [C++ Primer Plus] 第9章、内存模型和名称空间(二)课后习题
一.复习题 2.using声明和using编译指令的区别 using声明: using std::cin; using std::cout; using std::endl; using编译指令:us ...
随机推荐
- linux内核分析笔记----中断和中断处理程序
中断还是中断,我讲了很多次的中断了,今天还是要讲中断,为啥呢?因为在操作系统中,中断是必须要讲的.. 那么什么叫中断呢, 中断还是打断,这样一说你就不明白了.唉,中断还真是有点像打断.我们知道linu ...
- pytorch nn.Embedding
pytorch nn.Embeddingclass torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_no ...
- @游记@ CQOI2019(十二省联考)
目录 @day - 0@ @day - 1@ @day - 2@ @后记@ 我只是来打酱油哒-- 顶多能进个 E 类继续打酱油. 原本还在互奶 A 队,结果现在--铁定进不了队啦. 对初中生的歧视啊 ...
- nginx简单使用(windows)
本篇文章对术语不作讲解 下载nginx 首先,进入nginx官网http://nginx.org/en/download.html. 找到Stable version,此处的版本是稳定版本: 下载完成 ...
- let & const 命令
一.let命令 用于声明变量. 1) 所声明的变量只在let命令所在代码块内有效.(块级作用域) { let a=10; var b=1; } a // ReferenceError: a is no ...
- PyTorch中view的用法
相当于numpy中resize()的功能,但是用法可能不太一样. 我的理解是: 把原先tensor中的数据按照行优先的顺序排成一个一维的数据(这里应该是因为要求地址是连续存储的),然后按照参数组合成其 ...
- 多线程:“对象当前正在其他地方使用”如何解决 system.drawing
使用这个委托,在拥有此控件的基础窗口句柄的线程上执行指定委托 this.Invoke(new Action(() => { node.SetValues(values); }));
- pytorch实现BiLSTM+CRF用于NER(命名实体识别)
pytorch实现BiLSTM+CRF用于NER(命名实体识别)在写这篇博客之前,我看了网上关于pytorch,BiLstm+CRF的实现,都是一个版本(对pytorch教程的翻译), 翻译得一点质量 ...
- P1083 合并序列
题目描述 有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词. 输入格式 输入文件第一行包含一个正整数N: 接下来N行,每行一个单词,长度不超过100: 最后一行包含字符串T. 已知:1≤N ...
- H3C DHCP中继工作原理