C++ 可变数组长度
来源:2-3 实现线性查找法
Natsu_
2021-12-29 19:02:27

老师我想问一下在类中的方法计算可变数组的长度,为什么sizeof(data)获取的是指针的大小,而不是输入的data数组的长度呢
1回答
在 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,就是这个原因(之一)。
继续加油!:)
相似问题