【发布时间】:2021-11-13 21:36:27
【问题描述】:
我试图弄清楚为什么以多维数组作为形式参数的函数的签名具有未调整大小的第一个维度,而其他维度则没有。其实上述陈述第二部分的答案很明确:不传递维数信息,编译器将不知道多维数组在内存中是如何组织的。 困扰我的是不一致。
为什么不要求明确指定所有维度(包括第一个维度)?
我想出了一个理论,我想看看它是否正确。
数组最常见的用法是一维数组。鉴于数组名称是指向数组第一个元素的指针,Dennis Ritchie 希望一维数组具有完全相同的签名,无论是使用数组语法还是使用指针语法。
使用指针语法,如果不指定大小信息,就不可能知道函数中要处理多少个元素。因此,丹尼斯·里奇(Dennis Ritchie)也通过使数组未调整大小(甚至让编译器完全忽略第一个维度的大小信息,如果提供的话)来强制对数组语法进行相同的签名。换句话说,您将有一个形式参数是指针或未调整大小的数组,而第二个形式参数是数组大小。
【问题讨论】:
-
K&R "C" 应该提供接近硬件的低级访问权限。所以语法确实显示了事物的“如何”。你应该知道你在哪里做什么。如今,它更多地是关于抽象,我们已经有了像 std::vector、std::array 或我们自己的多维数组包装器,它们构建在这些较低级别的结构之上。
-
“使用指针语法不可能知道函数中有多少元素要处理” 显然这不适用于空终止的 Cstrings。
-
在 C++ 中,如果您不让数组衰减为指针,您可以 要求明确指定所有维度。顺便说一句,你读过What is array to pointer decay?
-
@Sandeep 这只是一个约定 :)
-
几点观察:(1) 在 K&R C 中,您不能指定可变尺寸大小。如果您指定了大小,它必须是一个常数。 (2) 你并不总是知道大小。例如,考虑
strlen。这需要一个char *,相当于char []。您在调用时不知道大小,因此要求它没有意义。
标签: arrays c multidimensional-array implicit-conversion