当前位置: 首页 > 知识库问答 >
问题:

这段代码如何在不使用sizeof()的情况下确定数组大小?

戴建义
2023-03-14

通过一些C面试问题,我发现一个问题说明“如何在不使用sizeof运算符的情况下在C中找到数组的大小?”,其解决方案如下。它起作用了,但我不明白为什么。

#include <stdio.h>

int main() {
    int a[] = {100, 200, 300, 400, 500};
    int size = 0;

    size = *(&a + 1) - a;
    printf("%d\n", size);

    return 0;
}

正如预期的,它返回5。

size = (&arr)[1] - arr;

共有1个答案

孟鹏海
2023-03-14

当您向指针添加1时,结果是指向类型的对象序列(即数组)中下一个对象的位置。如果p指向int对象,则p+1将指向序列中的下一个int。如果p指向int的5元素数组(在本例中,表达式&a),则p+1将指向序列中的下一个int的5元素数组。

减去两个指针(前提是它们都指向同一个数组对象,或者其中一个指针指向数组的最后一个元素)得到这两个指针之间的对象(数组元素)的数量。

表达式&a产生a的地址,类型为int(*)[5](指向int的5元素数组的指针)。表达式&a+1产生a之后的下一个int的5个元素数组的地址,并且具有int(*)[5]类型。表达式*(&a+1)取消引用&a+1的结果,从而产生a最后一个元素后面的第一个int的地址,并且具有int[5]类型,在此上下文中,该类型“衰减”为int*类型的表达式。

类似地,表达式a“衰减”为指向数组第一个元素的指针,类型为int*

一张图片可能会有帮助:

int [5]  int (*)[5]     int      int *

+---+                   +---+
|   | <- &a             |   | <- a
| - |                   +---+
|   |                   |   | <- a + 1
| - |                   +---+
|   |                   |   |
| - |                   +---+
|   |                   |   |
| - |                   +---+
|   |                   |   |
+---+                   +---+
|   | <- &a + 1         |   | <- *(&a + 1)
| - |                   +---+
|   |                   |   |
| - |                   +---+
|   |                   |   |
| - |                   +---+
|   |                   |   |
| - |                   +---+
|   |                   |   |
+---+                   +---+

这是同一存储的两个视图--在左侧,我们将其视为int的5个元素数组序列,而在右侧,我们将其视为int的序列。我还展示了各种表达方式及其类型。

C 2011年在线草案,6.5.6/9

 类似资料:
  • 我们有一个应用程序,将部署在具有不同IP的服务器上。JNLP是在构建时生成的。因此,我们定义了没有代码库的JNLP: 然而,当第二次启动这个应用程序时(从第一次启动时创建的桌面图标),代码库被设置为本地文件系统,这是绝对无用的。我希望Java Webstart在第一次启动应用程序时使用实际的源地址设置代码库。这似乎不是真的。 我如何准备一个通用的JNLP,它可以在不同的服务器上使用而无需修改?

  • 问题内容: 我在线上看过很多教程,说您需要检查服务器是否通过HTTPS进行了安全连接。我的问题是,在我使用的某些服务器上,这是一个未定义的变量,导致错误。我可以检查是否应该定义另一个变量? 为了清楚起见,我目前正在使用以下代码来确定它是否为HTTPS连接: 问题答案: 即使未定义,这也应该始终有效 : 该代码与IIS兼容。 : 1)如果通过HTTPS协议查询脚本,则设置为非空值。 2)请注意,当将

  • 在Java中,如何在不使用条件或三元运算符的情况下确定一个数字是奇数还是偶数? 这个问题是我的老师提出的。他还给了我一个提示,使用位运算符是可能的。

  • 问题内容: 我有一个带有GET处理程序的简单控制器,该处理程序接受一个对象来绑定请求参数: 这是一个简单的POJO类: 一切正常,但我想摆脱设置者,使该对象不可变为公共使用。在Spring 5.0.2 之前的处理程序方法文档中,我们了解到可能的有效方法参数是: 命令或表单对象将请求参数绑定到Bean属性(通过设置器) 或直接 绑定 到字段 是否可以以某种方式覆盖默认的Spring Boot配置,以

  • 问题内容: 我正在尝试压缩数据库中最大的表。我将通过运行SP_ForEachDB存储过程来做到这一点。但是我不知道如何查看总页数。我可以通过此查询获取行数… 哪个返回: 对我所有的桌子等等。 我在寻找相同的东西,但返回的是页面计数。 问题答案:

  • 问题内容: 在Mongoose的早期版本(针对node.js)中,可以选择使用它而不定义架构 但是在当前版本中,“ noSchema”功能已被删除。我的架构可能会经常更改,并且实际上不适合已定义的架构,因此,是否有一种新的方式在猫鼬中使用无架构的模型? 问题答案: 我想这就是您要寻找猫鼬严密的东西 选项:严格 严格选项(默认情况下启用)可确保未在架构中指定的添加到模型实例的值不会保存到数据库中。