【问题标题】:C get element on place without parenthesisC在没有括号的情况下获取元素
【发布时间】:2019-12-18 19:21:41
【问题描述】:

我创建了数组:

int main()
{
    int num[3] = {1, 2, 3}
    return 0;
}

我想将元素放置到位 1。

为什么我不能通过这段代码获取元素?

printf("%d", *(num + (sizeof(int)*1)));

这有什么不同?

printf("%d", *(num + 1));

【问题讨论】:

  • 谷歌“指针算法”。
  • 有什么不同? sizeof(int) 不等于 1。
  • 整数可以是 2,4,字节。
  • 指针运算以所指向的类型为单位工作,因此*(num + 1) 是num[1],而*(num + sizeof int) 超过了sizeof(int) - 1 元素。

标签: c arrays


【解决方案1】:

我了解您认为使用 sizeof(int) 递增指针将使您到达数组中的下一个成员。然而,这不是它的工作原理:

当你写作时:

printf("%d", *(num + 1));

指针前进到数组中的下一个成员(它是一个 int 指针,因此当您增加它时,它会前进 sizeof(int)(通常为 4)字节)。但是当你写的时候:

printf("%d", *(num + (sizeof(int)*1)));

您尝试将指针前移 4 个成员(或 4*sizeof(int) 个字节),这超出了数组的边界。

【讨论】:

    【解决方案2】:

    对于printf("%d", *(num + (sizeof(int)*1))); 有 (sizeof(int)*1)) 是 4 [int 的大小 = 4]。 num 的类型是 int 指针,这意味着添加 num + (sizeof(int)*1)) 会将您带到数组的第四个元素,这是超出范围的,因为您只用 3 个元素初始化了数组。

    【讨论】:

    • sizeof int 不一定是 4,例如,在 64 位系统上可能是 8,甚至有系统(例如 DSP)CHAR_BIT 不是 8,即大小不是以 8 位字节为单位的。
    • 确实,我明白你的意思,你是对的。我本可以更好地表达自己。
    • 我用过的第一个 C 编译器(Apple 上的 Aztec C/6502][)有 sizeof(int) == 2...
    【解决方案3】:

    运算符 sizeof 给出了给定类型所需的字节数。因此,此结果将根据类型和机器而变化,并且不会始终等于 1。对于整数(32 位),通常为 4,并且您正在尝试访问 num[5] em> 不存在的。

    您可以找到更多关于不同类型的sizeofhere。

    【讨论】:

    • @Arkku 是的,严格来说,你是对的,谢谢。
    猜你喜欢
    • 2012-01-02
    • 2020-11-23
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多