前言:首先,我的博客主要记录的是部分容易遗忘,但是比较重要或是值得了解的知识点。很多基本概念我并不会阐述,所以它更适合用来复习;其次,这些知识点是从我自己的角度出发整理的,因此我认为的重点可能和你不同,有的内容可能不完整或有错误,希望大家多多包涵,如果能指出我的错误,我会非常感激!
1.关于编译器、链接器、集成开发环境的概念
编译器、链接器:
我们写的源文件并不可以直接运行,例如test.c只是一个C语言的代码块,而电脑只能识别二进制的指令,所以要让test.c能被执行,就要让它从C语言转为二进制的计算机能识别的指令。编译器可以将我们的多个.c文件转为多个.obj文件,这些.obj文件又可以通过被链接器打包转为一个.exe程序,这个程序便可以直接被电脑执行。
集成开发环境(IDE):
简单地,集成开发环境就是我们平时写代码用到的软件,如Visual Studio 2022,它里面包含了如上所说的编译器、链接器等等。它使得我们只用负责写代码,而不用关心其他东西,让我们写代码更方便。
2.关键字易错:注意define并不是C语言的关键字,它是由编译器实现的,而不是C语言
sizeof属于关键字,不要以为它是函数。sizeof计算的是变量或类型的长度,包括自定义类型struct和int [n]。使用sizeof时,除了写sizeof(a)还可以写成sizeof a
3.字符串\0和printf理解:
这段代码可以帮助我们理解\0和printf,我第一次只想打印arr1,但你仔细看就发现在一堆“烫”的乱码后跟着arr2的字符,说明printf不遇到\0就不会停,会一直访问内存并打印,在这里printf一直访问到我创建的arr2后面隐藏的的\0才停下来。当我打印arr2的大小时,发现它也确实藏着一个\0,\0算一个字符,会占用一个字节,因此这里打印的是7而不是6。
如果我限制arr2的大小,我们就会发现又多了一段乱码。
这是因为我限制了arr2的大小至多是6个字节,因此\0没有容纳空间了,导致printf打印过来时arr2的末尾没有\0,因此打印不会停止,会继续打印直到遇见\0。
当然,这种写法本身就是错误的,但我们可以关注这种错误导致的现象理解\0的作用。
4.转义字符:
第一类转义字符:防止被解析成3字母词,防止在编译过程中你想表达的意思被计算机“误会”,如 \? \\ \' \"
这类转义字符真正想要表达的意思是第一根斜杠\之后的那个字符要表达的
第二类转义字符:如\n \a 等有实际含义,这里不展开讲述,不用全部记住
第三类转义字符:进制转换
\xxx:这里xxx表示八进制数字,如\010表示9,\130表示字符X,除了这里,八进制数字一般以0开头,如011、070都是八进制形式
\xyy:这里yy表示十六进制数字,前面的x是十六进制的标志,必须写,如\xa表示10
\xxx和\xyy均视为一个字符,它们的含义是转化为十进制后所对应的ASCII码值所对应的意思
5.数据类型中的内置类型:布尔类型(_Bool)与整型、浮点型、字符型都是内置类型,其中布尔类型的大小是1字节,以_Bool a = true赋予变量真假意义,但其实布尔类型也可被替代,C语言中一般用0表示假,非0表示真。
6.全局变量位于静态区,局部变量(栈区)前面加一个static后由局部变量变为静态变量,储存位置由栈区变为静态区。全局变量加上static后作用域缩小,无法通过extern被外部文件访问。
7.作用域与生命周期有区别,如static修饰变量使其成为静态变量后,其生命周期与全局变量的生命周期相同,但其作用域在大括号以内,可能远远小于全局变量
8.long类型的大小可能与int相同(4字节),也有可能是8字节,但long long一定是8字节;
double和long double类型大小可能相同(8字节),也可能是16字节
9.一般创建浮点数默认double类型,如3.14,如果要创建float类型,数字后加f,如3.14f。
10.sizeof要用size_t来接收,strlen函数的使用要用%zd形式来打印和用size_t来接收。
原因是C语言标准只说明了sizeof的计算结果、strlen函数的返回类型是无符号整数(unsighed),但并没有指出是无符号短整型、整形或是长整型,因此每种编译器根据自己的情况将自己采用的返回类型重命名为size_t,这方便程序员的使用。
以上10点仅为我的部分整理,今后可能会添加,也欢迎大家留下意见!