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

q09*_*987 2 c++

可能重复:
C++:sizeof表示作为参数传递的数组长度
Sizeof数组

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

Lig*_*ica 19

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

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

实际:

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

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

int arr[3] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

只是编译器可以3从初始化器中为您轻松填写.


另外,如果通过引用传递数组,则可以保留尺寸.为方便起见,您可以使用模板,这样您只需要一个函数,无论数组具有什么维度(因为维度是类型的一部分):

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

对此的扩展是使用的好建议sizeof.你很容易陷入陷入陷阱的陷阱,以为你正在评估一个阵列,当然,真的,你不是.请改用:

template <typename T, size_t N>
size_t length_of_array(T (&)[N]) {
   return N;
}
Run Code Online (Sandbox Code Playgroud)

尝试在除正确数组之外的任何东西上使用此函数都会因编译器错误而失败,而不是像代码那样默默地给出误导性值.

当然,将原始数组替换为类型boost::array(或std::arrayC++ 0x)或甚至std::vector(可调整大小)的对象是最好的方法.:)