sizeof(nums1) / sizeof(nums1[0])和sizeof(nums1)区别

这是一个非常常见的问题,涉及到如何计算数组的大小。你提到的两种写法,int size1 = sizeof(nums1);int size1 = sizeof(nums1) / sizeof(nums1[0]); 的差别,实际上是由于数组的内部表示方式不同所导致的。

解释 sizeof(nums1) / sizeof(nums1[0])

  1. sizeof(nums1):在 C 语言中,nums1 是一个指向数组第一个元素的指针(如果你传递的是一个数组给函数)。因此,sizeof(nums1) 计算的是指针类型的大小,而不是数组的实际大小。具体来说:

    • 如果 nums1 是一个指向 int 的指针(如 int *nums1),那么 sizeof(nums1) 给出的结果是指针的大小(通常是 4 或 8 字节,取决于操作系统和编译器的架构)。
    • 它不会告诉你数组中元素的数量。
  2. sizeof(nums1[0]):这个表示的是 nums1[0] 的大小,也就是数组中单个元素的大小。在你的例子中,如果 nums1 是一个 int 类型的数组,sizeof(nums1[0]) 就是单个 int 类型的大小,通常为 4 字节。

  3. sizeof(nums1) / sizeof(nums1[0]):这个表达式通过将数组的总字节数(sizeof(nums1))除以单个元素的字节数(sizeof(nums1[0])),从而得出数组中元素的个数。也就是说,这个公式计算了数组的长度。

为什么 sizeof(nums1) 在函数中不能直接给出数组长度?

  • 数组在传递给函数时退化为指针
    • 当你将一个数组传递给函数时,C 语言不会传递数组本身,而是传递数组的 指针。这意味着在函数内部,nums1 将不再是一个数组,而是一个指针(例如 int *nums1)。因此,sizeof(nums1) 会返回指针类型的大小,而不是数组的大小。
    • 因为数组在函数参数传递时会被退化为指针,所以你无法直接使用 sizeof(nums1) 来得到数组的长度。

例子:如何正确计算数组长度

假设我们有一个数组:

int nums1[] = {3, 2, 3};
  1. 函数外部,我们可以使用 sizeof(nums1) 来计算数组的总字节数。例如:

    int size = sizeof(nums1);  // 总字节数
    

    假设 nums1 有 3 个 int 元素,每个 int 4 字节,那么 sizeof(nums1) 会返回 12(3 * 4 字节)。

  2. 然而,当我们将 nums1 传递到一个函数时,数组会退化为一个指针。所以:

    void func(int* nums, int numsSize) {
        int size = sizeof(nums);  // 这里计算的是指针的大小,而不是数组的大小
        printf("%d\n", size);  // 输出的是指针的大小,而不是数组的元素个数
    }
    
    func(nums1, sizeof(nums1) / sizeof(nums1[0]));  // 传递数组大小和长度
    

    在这个例子中,sizeof(nums) 会给出指针的大小,而不是数组的实际大小。为了获取数组长度,我们需要 传递数组的大小 或通过 sizeof(nums1) / sizeof(nums1[0]) 来手动计算数组的元素个数。

总结

  • sizeof(nums1) 计算的是整个数组的字节数,但在传递数组到函数时,nums1 变成了一个指针,sizeof(nums1) 就是指针的大小,无法得到数组的元素个数。
  • sizeof(nums1) / sizeof(nums1[0]) 通过总字节数除以单个元素的字节数,得到了数组的元素个数,这是正确的计算数组长度的方式。

因此,int size1 = sizeof(nums1) / sizeof(nums1[0]); 是正确的方式来计算数组的长度,特别是在函数内部处理数组时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好玩的Matlab(NCEPU)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值