1.前言
疫情席卷下,很难静下心读书,但还是慢慢品味它吧
(有不足之处还望指正,这对博主非常重要!!)
2.笔记
第1章 快速上手
1.1简介
程序1.1 重排字符
1.1.1 空白和注释
1.注释:① / * 开始 * /结束 (注释不能嵌套)
② 用 //
2.从逻辑上删除一段代码,可以使用 #if指令 (在 VS2019上尝试后发现不能,有点奇怪欸)
#if 0
statements //语句
#endif
1.1.2 预处理指令
- 例子:
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
以上为预处理指令,因为它们是由预处理器解释的 (预处理器读入源代码,根据预处理指令对其修改,然后再把修改过的源代码递交给编译器)
【比如,上面的第一行,预处理器会用名字为stdio.h的库函数头文件内容替换第一条语句,结果仿佛就是stdio.h的内容被逐字写到源文件的那个位置】
2.stdio.h头文件,可以使我们访问标准I/O库(Standard I/O Library)中的函数,这组函数用于执行输入、输出。
3.如果有一些声明需要用到不同的源文件中,可以将这些声明放到单独的文件中,然后用#include指令把这个文件包含到需要使用这些声明的源文件中
4.#define 为另一种预处理指令,可以将某个特定的符号定义为特定值
(插播:用#define宏定义的常量和const定义常量的区别
#define PI 3.14159
const float PI = 3.14159
C语言中,宏定义的时候,不会为其分配额外的空间,只是在编译期间将符号常量替换为特定值
而 用const 则本质上为变量(常量:不变的变量),不允许修改,仍分配空间
)
5.函数声明(函数原型) 告诉编译器这些即将被定义的函数的特征,这样这些函数在被调用之时,编译器可对它们的准确性进行检查。
每个原型以 类型名 开头,(表示函数返回值的类型),之后为 函数名 ,函数参数(参数名并非必要的,给出参数名的目的是为了提示它们的作用)
int Add(int a,int b);
6.在其它语言中,无返回值的函数被称为过程
7.假如程序的源代码由几个源文件组成,那么使用该函数的源文件都必须写明该函数的原型。将原型放在头文件中,并用#include 包含他们,可以避免由于同一个声明的多份副本而导致的维护性问题。(雾)
1.1.3函数
1.每个C程序都必须有一个 main函数,因为它是程序执行的起点。
2.C语言中,数组参数是以引用的方式进行传递的,也就是传址调用,而标量和常量则是 值传递
(事实上,所有传递给函数的参数都是按值传递的,第八章会讲!)
3.gets函数从标准输入读取一行文本并把它存储于作为参数传递给它的数组中。一行输入由一串字符组成,以一个换行符(newline \n)结束。gets函数丢弃换行符,并在末尾存储一个NUL字节(一个NUL字节是指字节模式为全0的字节 即ASCII字符集 中的 '\0’的名字),当gets函数被调用,但实际并不存在输入行时,它返回NULL值,表示到达了输入的末尾**(文件尾 EOF)**
4.字符串就是一串以NUL字节结尾的字符。NUL作为字符串终止符,它本身并不被看作是字符串的一部分。 字符串常量 即源程序中被用花括号括起来的一串字符
5.常用的printf格式控制符
1.1.4函数解析
1.scanf 的所有标量函数前面必须加上“&” 符号,数组参数前面不需要加上(加上也可以),但是数组参数中出现了下标引用,则前面必须加上“&”
2.对于scanf,它的输入值中的空白部分会被跳过,值后面的空白表示该值的结束。
3.
声明: 告诉编译器要使用这个函数,没找到定义不要紧,后面会补上定义。
函数原型: 函数声明中给出的函数名、返回值类型、参数列表(主要是参数类型)等与该函数有关的信息。
声明中的参数个数、类型和函数返回值要完全匹配
4. 函数声明中的数组参数可以不指定数组的长度
5.
6.scanf函数每次调用时,都会从标准输入读取一个整数,如果转换失败,不论是因为 文件已经读完 还是因为下一次输入的字符无法转换为整数,都会返回0,
3.小声bb
“指针是C语言很重要的部分,正是指针使得C语言威力无穷!!”
欢迎交流、指正~
4.更新日志
2022.3.31 开始整理