C++ 中的数组和 sizeof()

问题描述 投票:0回答:1

据说,当数组作为参数传递给函数时,它会衰减为指针,并且数组的长度也需要作为参数传递。这意味着原始数组存储了有关其大小的信息。 事实上,函数体内的

sizeof(arr)
(其中
arr
是函数的参数)应该返回
8
(字节),因为这是 64 位机器中指针的大小。同时
sizeof(arr)
,当
arr
不是参数时,返回整个数组的实际大小(以字节为单位)。

#include <iostream>
void foo(int arr[]) {
  // prints 8
  std::cout << sizeof(arr) << "\n";
}

int main() {
  int arr[] = {1, 2, 3, 4, 5};
  // prints 20
  std::cout << sizeof(arr) << "\n";
  // prints 8
  foo(arr);
}

但是数组的名称已经是指向其第一个元素的指针。

arr[i]
只是
*(arr + i)
。这就导致了一个矛盾。要么:

  1. 数组的名称不是指向其第一个元素的指针(正如我被告知的)。但那是什么?如果它不是指针,为什么可以用它进行指针运算?
  2. 数组的名称实际上是指向第一个元素的指针。但为什么它保留的信息与它衰变成的指针不同呢?
c++ arrays pointers sizeof
1个回答
2
投票

这就导致了矛盾。

不,不是。 在某些情况下,数组会衰减为指向其第一个元素的指针。例如,数组 衰减为指针的一种情况是

decltype
:

int arr[2];
decltype(arr) i;     //i is int[2] and array does not decay to a pointer here
© www.soinside.com 2019 - 2024. All rights reserved.