刷了一千道选择题,我总结了这些C语言易错点【第二弹】

写在开头:本文结论均有验证,如有错误,感谢反馈!!!
大家好,我是每天都在学习的云师傅,希望这篇文章对大家有所帮助。
![在这里插入图片描述](https://img-blog.csdnimg.cn/dba4dadf2d4d4034a2cb74aa81b399e7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55KD5pyI5YG25YOP5LqR5aCH,size_20,color_FFFFFF,t_70,g_se,x_16

1.C语言基础知识

1.C语言内存区域划分:

|——————————————————————————————————————————|
|栈区(向下增长)(局部-入栈出栈,先进后出)    |
|——————————————————————————————————————————|
|堆区(向上增长)                             |
|——————————————————————————————————————————|
|未初始化全局区                            |
|——————————————————————————————————————————|
|已初始化全局区--全局数据区               |
|——————————————————————————————————————————|
|静态数据区域-(字符常量区)                 |
|——————————————————————————————————————————|
|代码区                                    |
|——————————————————————————————————————————|
(值得一提的是这个并不是真正的内存,这是操作系统的概念,
实际上为进程地址空间)

2..'0'字符数字不同于数字
演示:
在这里插入图片描述

3.转义字符一览:
在这里插入图片描述
3.头文件不能定义全局变量,否则如果有多个文件,那链接时会冲突。

4.偷个懒,直接放截图:
在这里插入图片描述

2.操作符

1.++问题

举例:++(a++)   a++的结果是4,然后进行++4是不对的。
reason:++运算只是针对于变量的,不能对常量来进行++运算。

3.关键字

1.static
-静态全局变量的作用域仅限于当前源文件,静态局部变量的作用域仅限于定义的块语句里面。但是他们和全局变量一样都存储在全局区。

2函数的隐含储存类型是extern,函数的形参或变量的储存类型为auto

auto被解释为一个自动存储变量的关键字,也就是申明一块临时的变量内存。
只能在语句块({})内部使用,不过我们每次定义临时变量都省略了这个关键字。
例如:auto int a=10
补充:
extern、register、static、auto
分别是定义外部变量、寄存器变量、静态变量、自动变量
自动变量(auto)和寄存器变量(register)属于动态存储,调用时临时分配单元
而静态变量(static)和外部变量(extern)属于静态存储,在整个程时都存在

4.构造类型

(1)数组

1.数组名相当于常量,不可给它赋值,即进行数组的整体赋值,只可以在定义的时候整体初始化,更不可进行数组名++或--
在这里插入图片描述

2.2.字符串常量存储在常量区,其内容不可修改
演示:【程序崩溃】
在这里插入图片描述
3.int**不能指向二维数组,应该使用行指针int(*)[]

(2)联合体

1.联合体大小计算规定

1.大于等于最大的那一个变量的大小。
2.是最大的那种类型大小的整数倍

5.函数

1.单向值传递

简单变量(int等等,相较于指针来说)作为实参时,
将把该变量所占内存单元的值传递给形参,实参和形参各占不同的内存单元,
传递完后,实参和形参不再有任何联系,
所以这种传递方式也叫做:单向值传递方式。

2.返回值问题

return语句只能返回一个值,但这个值可以对应多个信息,比如,返回一个指针,这个指针指向一个数组,里头含有多个值

3.scanf语句输入带有空格字符串问题:
我们在使用scanf输入字符串时,如果输入的字符串有空格,则输入就停止了。这时我们会想到使用gets这个函数,但是如果今天就想用scanf这个函数能不能解决呢?当然可以!

输入语句scanf("%[^here]",x.a);(here是填结束符)
C语言中scanf()函数提供的“%[]”格式串可以用来进行多个字符的输入,
并对结束符进行自定义(^)。
对于%[]还可以用^+任意字符(例如回车:'\n')来结束字符串的输入。

演示:(\n作为结束符)
在这里插入图片描述
4.free函数并不会清除空间内容,只是把所释放空间还给了操作系统

5.printf函数

printf函数中,"%.5s"的意思是字符串最多输出5个字符。
再问:
那如果是"%5s"的话是什么意思?
答:
"%5s"的意思是,输出至少5个字符,如果不够五个字符,左侧用空格补齐。

6.realloc使用时参数后面的大小是新的加之前大小之和,因为他如果不能直接在原数组后面扩增,需要另找一块内存。另外:realloc时要去求被扩容的也是动态开辟

7.memset(小声bb:我的痛处- -)
.memset是对传入的内存块进行修改,例如
在这里插入图片描述
-10000000100000001000000010000000 一个一个字节的进行修改 对于整形,适合整体赋值0或-1;

6.预处理

1.宏替换是在预编译时执行的,而函数是在运行时执行的。宏替换在编译前进行,不分配内存 . 宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)

2.宏和const的区别
(1)#define定义的宏是在预处理阶段进行替换的,const常量是在编译、运行阶段进行使用的。注意是宏替换仅仅的字符串替换,并不会检查其合法性。 预处理阶段做了的任务: 【重点】
1:将头文件中的内容(源文件之外的文件)插入到源文件中
2:进行了宏替换的过程(简单的字符串替换),定义和替换了由#define指令定义的符号
3:删除掉注释的过程,注释是不会带入到编译阶段
4:条件编译
(2)所有的宏替换只是简单的字符串替换,注意是字符串替换,所以并不会检查其合法性,而const定义的常量依然是内置类型等,所以会对其进行类型安全检查。
(3)宏定义在程序中使用了几次在预处理阶段就会被展开几次,并不会增加内存占用,但是宏定义每展开一次,代码的长度就要发生变化(有利有弊),而const常量也会为其分配内存(如果是动态申请空间肯定就是堆中了)。
(4)const定义的常量只有一次拷贝,而define定义的变量在内存中并没有拷贝,因为所有的预处理指令都在预处理时进行了替换。

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值