c语言学习小结,学习c语言总结经验

首页 > 教育 > 作者:YD1662024-04-17 10:24:56

1.对于ASCII字符,使用一个字节存储,并且该字节的最高位是0;对于中国的字符,使用两个字节存储,并且规定每个字节的最高位都是1。由于单字节和双字节的最高位不一样,所以字符处理软件很容易区分一个字符到底用了几个字节。
2.sizeof用来获取某个数据类型或变量所占用的字节数,如果后面跟的是变量名称,那么可以省略(),如果跟的是数据类型,就必须带上()。sizeof是C语言中的操作符,不是函数,所以可以不带()。
3.二进制以0b(或0B)开头,八进制以0开头,十六进制以0x(或0X)开头。
4.printf格式控制%[flag][width][.precision]type 十六进制:%p short:%hd int:%d long:%ld long long:%lld char:%c string:%s float:%f(指数形式:%e(E)) double:%lf(指数形式:%le(E)) %u 以十进制形式输出无符号数 八进制:%o 十六进制:%x(或%X) 八进制十六进制加#可以在输出的数字前面加前缀。
5.多行注释不能嵌套使用。
6.对于全局变量,它的默认初始值始终是0,因为全局变量存储在内存分区中的全局数据区,这个区域中的数据在程序载入内存后会初始化为0;而对于局部变量,初始值是不确定的。
7.无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值。
8.gets()能读取含有空格的字符串,而scanf()不能。
9.清空输出缓冲区:fflush(stdout),windows平台下的printf()、puts()、putchar()等输出函数都是不带缓冲区的,所以不用清空。
10.清空输入缓冲区:int c; while((c = getchar()) != '\n' && c != EOF);
11.当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为0;
12.在C语言中,数组一旦被定义后,占用的内存空间就是固定的,容量是不可改变的,既不能在任何位置插入元素,也不能在任何位置删除元素,只能读取和修改元素,我们将这样的数组称为静态数组;
13.形参变量只有在函数被调用时才会分配内存,调用结束后,立即释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用;
14.当全局变量和局部变量同名时,在局部变量范围内全局变量被“屏蔽”,不再起作用。或者说,变量的使用遵循就近原则,如果在当前作用域中存在同名变量,就不会向更大的作用域中去寻找变量;
15.#include使用<>编译器会到系统路径下查找文件,使用""编译器先到当前目录下查找文件,如果没找到,再到系统路径下查找文件;
16.宏定义只是简单的字符串替换,由预处理器来处理,而typedef是在编译阶段由编译器处理的,它不是简单的字符串替换,而给原有的数据类型起了一个新的名字,将它作为一种新的数据类型;
17.带参数的宏和函数很相似,但有本质上的区别:宏展开仅仅是字符串的替换,不会对表达式进行计算,宏在编译之前就被处理掉了,不会占用内存。而函数是一段可以重复使用的代码,会被编译会给它分配内存,每次调用函数,就是执行这块内存中的代码;
18.#用来将宏参数转换为字符串,也就是在宏参数的开头和末尾添加引号。##称为连接符,用来将宏参数或其他的串连接起来;
19.C语言中几个预定义宏:__LINE__ __FILE__ __DATE__ __TIME__ __cplusplus;
20.使用指针是间接获取数据,使用变量是直接获取数据,前者比后者的代价更高;
21.C语言有两种表示字符串的方法,一种是字符数组,另一种是字符串常量,他们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取而不能修改;
22.数组也是类型,sizeof是根据符号的类型来计算长度的;
23.结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速;
24.大端和小端是指数据在内存中的存储模式,由CPU决定。小端模式将数据的低位存放在内存的低地址上,大端模式则相反。
25.C语言位域(位段),位域的宽度不能超过它所依附的数据类型的长度。当相邻成员的类型相同时,如果它们的位宽之和小于类型sizeof大小,后面的成员紧邻前一个存储。
26.按位与运算通常用来对某位清0或者保留某位,按位或运算可以用来将某位置1或者保留某些位,按位异或可以用来将某些二进制位反转;
27.WinDbg调试器。DebugView
28.调试窗口输出信息:OutputDebugString();
29.在32位模式下,一个指针或地址占用4个字节的内存,共32位,能访问的虚拟内存为2的32次方,即4GB。在64位编译模式下,一个指针或地址占用8字节的内存;
30.以32位的CPU为例,实际寻址的步长为4个字节,也就是只对编号为4的倍数的内存寻址。将一个数据尽量放在一个步长之内,避免跨步长存储,这称为内存对齐。
31.现代计算机都使用分页(Paging)的方式对虚拟地址空间和物理地址空间进行分割和映射,以减少换入换出的粒度,提高程序运行效率。目前几乎所有PC上的操作系统都是用4KB大小的页;
32.程序代码区、常量区、全局数据区在程序加载到内存后就分配好了,并且在程序运行期间一直存在,只能等程序运行结束后由操作系统回收;堆区:由程序员分配和释放,若程序员不释放,程序运行结束时由操作系统回收,堆的分配方式类似于链表;栈区:存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈;
33.每个线程的栈都是独立的,所以一个进程中有多少个线程,就有多少个对应的栈,对于windows来说,每个线程默认的栈大小是1MB(可以通过编译器修改),如果程序使用的栈内存超过最大值,就会发生栈溢出错误(stack overflow);
34.在进程地址空间中,代码区、常量区、全局数据区的内存在程序启动时就已经分配好了,大小固定,只能等到程序运行结束由操作系统回收,称为静态内存分配;栈区和堆区的内存在程序运行期间可以根据实际需要来分配和释放,不用在程序刚启动时就备足所有内存,称为动态内存分配;栈区内存由系统分配和释放,不受程序员控制,堆区内存完全由程序员掌控,非常灵活;
35.要想规避野指针,需要养成良好的编程习惯:1)指针变量如果暂时不需要赋值,一定要初始化nullptr,因为任何指针变量刚被创建时不会自动成为nullptr指针,它的缺省值是随机的;2)当指针指向的内存被释放掉时,要将指针的值设置为nullptr,因为free()只是释放了内存,并没改变指针的值;
36.C语言变量的存储类别:auto(默认,无需指定)、static、register、extern;static声明的变量称为静态变量,存储在静态数据区,即使代码块执行结束也不会销毁,静态数据区的变量只初始化一次;将使用频繁的变量声明为register可以提高程序运行效率;寄存器变量是动态分配的,因此只有局部变量和形参才能定义为寄存器变量;寄存器的长度一般和机器的字长一致,只有较短的类型如int、char、short等才适合使用register关键字;优秀的编译器会自动识别使用频繁的变量并指定为register;
37.函数的申明有没有extern都是一样的,变量的申明有extern才能申明;
38.static变量主要有两个作用:1)隐藏:程序有多个文件时,将全局变量或函数的作用范围限制在当前文件,对其它文件隐藏,这样可以在不同的文件中定义同名的变量和函数而不必担心命名冲突;2)保持变量内容的持久化:将局部变量存储到全局数据区,使它不会随着函数调用结束而销毁。

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.