【C语言避坑指南】学习记录

学习自B站Up双笙子佯谬的视频

【C语言避坑指南】看完这个视频,我再也不害怕指针!_哔哩哔哩_bilibili课件:https://github.com/parallel101/course作业:https://github.com/parallel101/hw12(还在准备中)https://www.bilibili.com/video/BV1US4y1U7Mh?spm_id_from=333.999.0.0C作为C++的四个次语言之一,是C++的基础,有些C的问题即使C++也要注意。

1.C语言从设计语法上来说是不支持重载的,因此会有abs、fabs、fabsf等诸多函数笨拙地实现不同类型参数求绝对值的功能,但这也给使用带来了限制。比如float a = -3.14f; float b = abs(a);就得不到想要的结果,只能得到3.0f。

 2.c++支持重载,对C的以上功能在std命名空间做了封装和改进,同一函数名支持不同参数。使用以上函数时,不加std则会默认使用C语言版本,需要考虑很多情况且很可能导致错误。另外,using namespace std虽然可以解决问题,但个人不是很推荐使用,因为std命名空间下也定义了很多可能在认知外的函数,如std::ws,tm,exa,size,data,next等,和我们定义函数名时的习惯冲突时,可能会发生危险的跳转。

 3.大端小端简便记法

用户为大,符合人类认知习惯的即为大端字节序。x=1时,大端:

 小端:

但是计算机和人类不同,以小端方式处理数据会更高效,所以主流硬件架构(x86,arm)都会使用小端字节序。两种使用大端字节序的地方:Java虚拟机,互联网协议包头中传输的数据类型(这也是为什么Java更适合做互联网服务的原因之一)。

4.指针只是存储的4字节或者8字节的地址,本身没有类型,都是void*。我们给它一个类型,如int*,只是为了解引用时确定可操作空间的大小(另外也会方便数组等地址偏移的操作,地址+1指向下一个元素而不是下一个字节)。指针本质上就是一个64位或者32位的整数,也可以强制转换为long等类型,但很多时候没必要。

注:void*指针偏移操作在某些沙雕编译器上不起作用,和char*不太一样,慎用void*偏移。

int*p = &x;

5.

6.一天一个奇妙而无用的小知识:对数组p[4], p[2]和2[p]都可以访问到数组的第二个元素,反正地址本质上是一个数。

7.网站推荐(在线转汇编):Compiler Explorer

8.POD类型:什么是 POD 数据类型? - 知乎

9.以下代码makearr()里的a不会在函数结束后立刻被释放,可以正常实现功能,但使用int a[1024],将变量放到栈上就会在函数结束后直接被释放。而C++的容器库内存分配都是分配到堆上,不会导致内存空间在函数结束时被立即释放(但a这个地址标识是放到栈上的),内存释放也会由RAII负责,无需我们去操心。内存分配可参考:第10篇:C++ 堆内存管理器-allocator - 知乎

10.字符串输出:char s[5] = {'H','e','l','l','o'}; print("%5s\n",s);可正常输出。为了安全最好定义char s[6] = {'H','e','l','l','o',0}; 而实际上字符串定义char str[] = "Hello"也是这么做的。

烫烫、屯屯的来源:(原因:ASCI码负数区给了汉字,0xcc在负数区,恰好表示烫)

关于烫和屯这一部分,小彭老师讲的好像有点错误,正确版本参考

程序员常说的“烫烫烫”是什么? - 知乎谢邀烫、屯等属于乱码,通常在程序有问题的时候才会显示。对于visual studio的编译器,分配空间后总要在…https://www.zhihu.com/question/338073015/answer/770549609?utm_source=wechat_session

11.字符串和字符串数组:定义方式为{'H','e','l','l','o'}这种单引号的,只有末尾加了终止符'\0'才认为是字符串,否则认为是字符数组。双引号定义方式"Hello"是字符串,隐式加了终止符'\0'。由此有一些sizeof、strlen的考察题目等等。 

12.string也分配到堆上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值