C++ 可变数组长度

来源:2-3 实现线性查找法

Natsu_

2021-12-29 19:02:27

https://img.mukewang.com/climg/61cc3fd609b7655c15230656.jpg

老师我想问一下在类中的方法计算可变数组的长度,为什么sizeof(data)获取的是指针的大小,而不是输入的data数组的长度呢

写回答

1回答

liuyubobobo

2021-12-30

在 C / C++ 中(主要是 C 风格),一但一个数组被当做参数传入另一个函数,这个数组就会被隐式转换成一个指针,指向这个数组的第一个元素(即数组的头指针)。这是被 C 标准定义的行为,C 编译器内部都是这样实现的。


所以,会有很多 C 语言规范明确说明,如果想要获得数组的长度,不要在函数中对数组参数使用 sizeof(虽然这不是一个代码规范问题,而是一个正确使用语言的问题),比如这里:https://wiki.sei.cmu.edu/confluence/display/c/ARR01-C.+Do+not+apply+the+sizeof+operator+to+a+pointer+when+taking+the+size+of+an+array


这个问题也叫做 array decay,即在传参过程中,数组退化成为了指针。如果你要感兴趣,可以 google 一下这个术语。甚至很多教科书直接说,array 本身就是 pointer。直接把 C 中的 array 当做 pointer 看待。这个说法严格意义上不准确,但是,依照这个说法的准则去编程,没有问题。


C 风格的标准做法是什么?就是在传入数组的同时,传入数组的大小。(见上面链接的 compliant solution 部分。)


另一个方法是,在传入数组头的同时,也传入数组尾(其实也就变相标识了数组的长度。)所以,C/C++ 中到处可以见到这样的代码,比如 sort,对于数组,的调用方式是 sort(arr, arr + n, cmp),而不是 sort(arr, cmp),需要那个 arr + n,就是这个原因(之一)。


继续加油!:)



3

算法与数据结构

波波老师5年集大成之作,算法与数据结构系统学习,考试、面试、竞赛通用

2627 学习 · 1090 问题

查看课程