【问题标题】:why do I see different values of array size in main vs other function [duplicate]为什么我在主函数和其他函数中看到不同的数组大小值[重复]
【发布时间】:2020-08-01 10:49:00
【问题描述】:

我创建了一个由十个整数组成的数组并打印它的大小 1.主要 2. 在名为 print 的函数中

#include <iostream>
using namespace std;
void print(int *a)
{
    cout<<sizeof(a);
}
int main()
{
    int arr[10];
    cout<<sizeof(arr)<<endl;
    print(arr);
}

输出是:

40

8

我期望在这两种情况下都是 40(作为 1 整数的大小=4 乘以 10 ),但第二种情况显示的是单个指针的大小,而不是整个数组的大小。这里发生了什么?

【问题讨论】:

  • sizeof(a)sizeof(int*) 始终不变
  • @UnholySheep 如何在 main 中产生 40,我也应该将 sizeof(a) 的大小设置为 sizeof(int*)
  • 数组可以衰减为指针,但它们不是指针。
  • @BessieTheCow 经过这么多天,现在我明白你的意思了。 :)

标签: c++ pointers pass-by-reference implicit-conversion pass-by-value


【解决方案1】:

从函数声明中可以看出

void print(int *a)
{
    cout<<sizeof(a);
}

函数处理指针。所以这个说法

cout<<sizeof(a);

根据使用的系统输出等于 4 或 8 字节的指针大小。

注意这一点,即使你会像这样声明函数

void print(int a[])
{
    cout<<sizeof(a);
}

您将得到相同的结果,因为编译器将参数隐式调整为 int * 类型。

即前面和这个函数声明是等价的。

如果您希望函数处理原始数组而不是指向作为参数传递的数组的第一个元素的指针,那么至少要声明该函数。

void print( int ( &a )[10] )
{
    cout<<sizeof(a);
}

即声明参数为引用。

或者你可以让函数像模板函数一样

template <size_t N>
void print( int ( &a )[N] )
{
    cout<<sizeof(a);
}

由于传递的数组在函数中没有被改变,所以参数应该有限定符 const

template <size_t N>
void print( const int ( &a )[N] )
{
    cout<<sizeof(a);
}

这是一个演示程序。

#include <iostream>

template <size_t N>
void print( const int ( &a )[N] )
{
    std::cout << sizeof( a ) << '\n';
}

int main() 
{
    int arr[10];

    std::cout << sizeof( arr ) << '\n';

    print( arr );

    return 0;
}

它的输出是

40
40

或者您可以使用类型模板参数定义模板函数。但同样,函数参数有一个引用类型。

#include <iostream>

template <typename T>
void print( const T &a )
{
    std::cout << sizeof( a ) << '\n';
}

int main() 
{
    int arr[10];

    std::cout << sizeof( arr ) << '\n';

    print( arr );

    return 0;
}

程序输出将与上图相同。

【讨论】:

    【解决方案2】:

    当您将数组传递给函数时,它会被调整为指向函数内第一个元素的指针。

    所以您在print 函数中看到的不是数组的大小,而是指针的大小,即sizeof(a) 等价于sizeof(int*)

    【讨论】:

      【解决方案3】:

      您应该会看到此代码的输出,并观察差异:

      #include <iostream>
      using namespace std;
      int* h()
      {
          int *a[10];
          cout<<sizeof(a);
          return a;
      }
      int main()
      {
          int *a=h();
          cout<<sizeof(a);
      }
      

      输出:

      40

      8

      现在 main 显示大小为 8(指针大小),函数 print 显示数组大小为 40。

      【讨论】:

      • 这个程序格式不正确,return a; 应该会产生错误
      猜你喜欢
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多