1.1C语言初阶易忘知识点速记

1.变量命名只能用字母,数字,下划线。开头不能用数字。

2.跨文件使用变量,要声明外部符号,

extern 类型 变量名。

3.常量分4种,字面常量,const修饰的常变量,#define定义的标识符常量,枚举常量enum。

const int a=1,a不能被修改了,但是a本质上还是变量,不能用于数组定义,

int arr[1]={0} 不能写成int arr[a]={0}。

#define定义的标识符常量,本质上就是常量,#define M 100,int arr[M]={0},这样写没问题。

4.转义字符 

\? 防止三字母词,??)是],\?\?)是??),

\' 让单引号是单个,不配对,这样可以打印',双引号也同样,

\\ 使\不再是转义字符,

\a 电脑会响一下,警告字符,

\b 退格符,覆盖前一个,

\r 回车,

\t 水平制表符,可以设置字节,

\f ,\v基本不用,

\ddd 1到3个八进制数字,如\073

\xdd 2个16进制数字,如\x46。

5.八进制0dd,十六进制0xdd。

6.关键字

     auto 所有局部变量的关键字,默认省略,

auto int a 。

     register 寄存器

     static 静态

     volatile

7.1.scanf读取失败返回EOF(-1),读取成功返回读取的个数。例如while(~scanf()),当读取失败了,~(-1)==0,为假,跳出循环。

8.static,静态的,三种用法。

     修饰局部变量。

普通的局部变量放在栈区上,这种局部变量进入作用域创建,出来后被释放,但是别static修饰后,就放在了静态区,创建好后,直到程序结束才释放。本质上是改变了存储位置,使执行效果不一样。不影响作用域,生命周期变长了。

     修饰全局变量。

不可以跨文件使用,把外部链接属性变成内部链接属性,作用域变小了。

     修饰函数。

与修饰全局变量作用相似。

9.内存分为栈区,堆区,静态区,栈区放局部变量,临时变量,函数参数,堆区放动态内存分配,静态区放静态变量和全局变量,直到程序结束被销毁。

10.%u,打印无符号整形(32位),%zd,打印size_t类型(64位),sizeof()返回size_t类型。

11.c语言是一门结构化的程序设计语言。

三种结构为顺序结构,选择结构和循环结构。

12.else和离它最近的尚未匹配的if匹配,注意悬空else,尽量多使用括号。

13.switch(整型表达式),case 整型常量。

14. break,用于switch,while,do while和for中,continue用于以上后三种循环中。 break是终止循环,跳出循环体。continue是结束本次循环,进入到循环体的下一次循环入口中去。

15. for 和while相比,for好处是不容易写出死循环。但是for小括号中的三个语句省略,很容易写出死循环,所以要尽量写完整,不要轻易省略。

16.getchar()返回输入字符是阿斯克码值,类型为int型。

17. scanf()函数,遇到空格键就会停止读取,而空格键后面输入的东西,还会存在缓存中,所以连续运用时要清除缓存区。可以用getchar()函数写一个循环,遇到回车键跳出循环,这样就可以有效地清除缓存。

18.Sleep(毫秒)休眠函数,停顿。

#include<windows.h>,

windows环境下为Sleep(),

linux环境下为sleep()。

19.system("cls"),清空屏幕,

#include<stdlib.h>。

20.生成随机数,rand(),#include<stdlib.h>,返回一个随机整数,在0到RAND_MAX(32767)的随机数。

rand()在使用之前要调用srand(无符号整数),要把有变化的值传入,传入时间戳,

time(指针),#include<time.h>,会返回时间戳,传入(unsigned int)time(null)。注意,srand()只要调用一次。

srand((unsigned int)time(null));

int ret=rand();

ret即为随机数。

如果想要1到100的随机数,只需要ret%100+1即可。

21.goto语句只能在一个函数内部跳转,不能跨函数,建议不要轻易使用。一般用于跳出多层嵌套。

22.关机程序

system("shutdown -s -t");t为时间(如果不写,回车直接关机(cmd)),单位是秒。 shutdown -a 取消关机。

23.写脚本.bat

shutdown

-f 强行关闭应用程序,

-m \\计算机名 远程操控,

-l 注销当前用户,

-r 关机重启,

-r -t,

-h 休眠,

如要定点关机,则at 00:00 shutdown -s。

24.double sqrt(double)

23.void* memset(void* ptr, int(char) value, size_t num);内存设置,把ptr指向的前num个byte的数据改为value值。

24.函数实参可以是常量,变量,表达式和函数(但必须有确切的值)。

25.写代码尽量少使用全局变量。

26.每一次调用函数都会为本次函数在内存的栈区上开辟一块空间。写一个递归函数,如果死循环会出现栈溢出的情况导致程序崩溃。

27.%u,无符号整形。

28.++比*优先级别高,例如*p++。

29.函数返回类型不写,默认为返回int型,返回最后一行的值。

30. printf返回所打印的字符串个数。

31.资源管理器右键点击属性,常规,将exe文件改成静态库lib文件,这样就实现了代码的隐藏。

32.导入静态库

#pragma comment(lib,"xxx.lib")。

33.全局变量不初始化默认是0。

34.函数栈帧,每一次函数调用都会为本次函数调用分配内存空间(是在内存的栈区),为本次函数调用分配的内存空间,被称为这次函数调用的栈帧空间。
35.高内聚低耦合:各模块间相互独立。
36.静态变量不初始化默认为0。

37.寄存器中有eax,ebx,ecx,edx,ebp,esp。其中上述最后两个是存放地址的,这两个地址是来维护函数栈帧的。栈先使用高地址,再使用低地址。ebp指向栈低指针(高地址) ,esp指向栈顶指针(低地址)。

38.main函数也是被其它函数调用的,函数最后的return 0,返回给mainret。

39.push 压栈,pop出栈。

40.调用一个函数,在栈上开辟了一段空间,那一小段空间里面存的初始值都是cccccccc,如果定义了一个变量,但是没有给它赋值,它默认存放的就是cccccccc,打印出来就是烫烫烫烫。

41.将call指令的下一条指令压栈,以便调用完函数返回的时候能找得到返回的地方。

42.形参并不是在被调用的函数内创建的,而是在调用它的函数内创建的。

43.函数的返回值会放在寄存器中,函数销毁的时候,这个返回值还在,但要注意的是函数只能有一个返回值。如果想改变多个值,就传入指针。

44.在整个函数的调用过程中,形参是最后销毁的。

45.给每个函数开辟的空间是不一样的,编译器会自动完成,一般不会出现比如说局部变量过多而导致栈满的情况。

46.启动一个新的解决方案,在里面可以建立多个项目,右击,改为启动项。

47.sizeof和strlen区别很大,strlen遇到'\0'就会停止,而sizeof,定义了多少就是多少。

例如,char arr[10]="asdfg";

strlen是5,sizeof是10。

48.a++,++a,a+1,有很多区别。前两者区别明显,但是后两者之间需要斟酌使用,特别是写递归函数,如果返回值不处理,可以++a后传入a,如果返回值处理,就只能传入a+1,因为++a,a自身已经改变,后者自身不改变。综上:尽量写a+1,++a不容易把握。

49.随着数组下标的增长,地址由低到高变化。

50.*(p+i)==arr[i],其中p=arr。

51.arr[3][4],可以理解为一个一维数组有三个元素,每个元素是一个元素为4的一维数组。

52.使用数组当心越界访问,编译器不会报错。

53.abs()求绝对值。

54.子函数里面尽量不要出现#define定义的常量,尽量在主函数里面传参传进去使用,便于以后修改。

55.数组传参,行参可以写成数组,也可以写成指针,本质上是指针。

56.&&操作符左边是假,右边的表达式不参与计算,||操作符,左边为真,右边表达式不参与计算。称之为短路。

56.结构体定义完要写;

57. C语言的整形算术运算总是至少以缺省整形类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数,在使用之前被转换为普通整形,这种转换称为整形提升。

58.只要是需要CPU处理的(printf),都需要整形提升,整形提升补符号位,注意符号,注意原码和补码。

59.虽然有优先级和结合性,但仍然不能确定唯一的运算方式,所以尽量多用括号。

60.scanf("%[^\n]")读取直到\n,这个方法可以读空格。

61.结构体的声明可以放在主函数里面,但如果这样它只能在主函数里面定义结构体变量。

62.char* strcpy(char* dest, const char* src)

把src中的内容(包括\0),覆盖到dest中,dest未被覆盖的内容还在,只是前面有\0,后面不会打印。

dest ********\0

src hi\0

拷贝后 hi\0*****\0

63.const int a = 1;

   a = 2;

以上这种方法不能改变a的值。

如果 

int* p = &a;

*p = 2;

这样可以该。

如果const int* p = &a;

*p = 2;

这样又不行了。但是p可以改。

如果 int* const p = &a

*p可以改,p不能改。
————————————————
版权声明:本文为CSDN博主「如果%有如果」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_73345579/article/details/127541561

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 40
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数九天有一个秘密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值