学习自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[5] = {'H','e','l','l','o',0}; 而实际上字符串定义char str[] = "Hello"也是这么做的。
屯屯的来源:(原因:ASCI码负数区给了汉字,0xcc在负数区,恰好表示屯)
11.字符串和字符串数组:定义方式为{'H','e','l','l','o'}这种单引号的,只有末尾加了终止符'\0'才认为是字符串,否则认为是字符数组。 双引号定义方式"Hello"是字符串,隐式加了终止符'\0'
由此有一些sizeof、strlen的考察题目等等。
12.string也分配到堆上。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)