c++ - 为什么 sizeof(intArray)/sizeof(int) 给出不同的值?

标签 c++

<分区>

Possible Duplicates:
C++: sizeof for array length
Sizeof array passed as parameter

#include "stdafx.h"
#include <iostream>

using namespace std;

void PrintArrayLength(int arr[])
{
    cout << "Function Array length is: " << sizeof(arr)/sizeof(int) << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int arr[] = {1, 2, 3};

    cout << "Array length is: " << sizeof(arr)/sizeof(int) << endl; // print 3

    PrintArrayLength(arr); // print 1
    return 0;
}

为什么一个地方 sizeof(arr)/sizeof(int) 的值为 1 而另一个地方的值为 3?

最佳答案

因为当您按值将数组传递给函数时,实际上是在传递一个指针(指向数组的第一个元素)。

void PrintArrayLength(int arr[])
{
    cout << "Function Array length is: " << sizeof(arr)/sizeof(int) << endl;
}

实际上:

void PrintArrayLength(int* arr)
{
    cout << "Function Array length is: " << sizeof(arr)/sizeof(int) << endl;
}

不要被允许将数组声明为 int[] 的语法糖所误导。实际上,没有这样的类型,你真正写的是:

int arr[3] = {1, 2, 3};

只是编译器可以从初始化程序中为您简单地填充 3


顺便说一句,如果您通过引用传递数组,您可以保留维度。为方便起见,您可以使用模板,这样无论数组的维度如何(因为维度是类型的一部分)您都只需要一个函数:

template <size_t N>
void PrintArrayLength(int (&arr)[N])
{
    cout << "Function Array length is: " << sizeof(arr)/sizeof(int) << endl;
}

对此的一个扩展是使用sizeof 的好建议。您很容易落入您曾经落入的陷阱,认为您正在估量一个数组,而实际上您并没有。改用这个:

template <typename T, size_t N>
size_t length_of_array(T (&)[N]) {
   return N;
}

尝试在除正确数组之外的任何对象上使用此函数将失败并出现编译器错误,而不是像您的代码那样默默地提供误导性值。

当然,用 boost::array(或 C++0x 中的 std::array)或什至 std::vector (可以调整大小)是最好的方法。 :)

关于c++ - 为什么 sizeof(intArray)/sizeof(int) 给出不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5523891/

相关文章:

c++ - 如何在 C++ 中将 10 位映射到 6 位(尽可能高效)?

c++ - 通过 ShellExecute() 打印到 Dymo LabelWriter Turbo 时出现随机延迟

c++ - 为什么下面这段带有非常量转换函数的代码没有歧义呢?

c++ - 如何在 CLion 中启用 C++11?

c++ - C++ 中类的成员函数的 pthread - 为什么不是模板?

c++ - 将 XCTest 单元测试添加到现有应用程序不起作用

c++ - 在 OGRE 中创建动态纹理时获取错误的 RGB

c++ - 将 std::variant 转换为另一个具有父类(super class)型集的 std::variant

C++ OpenGL 绘制一个房间

c++ - 画椭圆延迟再画一个