Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么sizeof(intArray)/sizeof(int)给出不同的值?_C++ - Fatal编程技术网

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

C++ 为什么sizeof(intArray)/sizeof(int)给出不同的值?,c++,C++,可能的重复项: #包括“stdafx.h” #包括 使用名称空间std; 无效打印阵列长度(内部阵列[]) { cout因为当按值传递数组给函数时,实际上是在传递指针(指向数组的第一个元素) 只是编译器可以从初始化器为您轻松地填写3 另一方面,如果通过引用传递数组,则可以保留维度。为方便起见,可以使用模板,以便无论数组具有哪个维度,都只需要一个函数(因为维度是类型的一部分): 尝试在正确数组以外的任何对象上使用此函数都会失败,并导致编译器错误,而不是像代码那样默默地给出误导性的值 当然,用

可能的重复项:

#包括“stdafx.h”
#包括
使用名称空间std;
无效打印阵列长度(内部阵列[])
{

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

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


另一方面,如果通过引用传递数组,则可以保留维度。为方便起见,可以使用模板,以便无论数组具有哪个维度,都只需要一个函数(因为维度是类型的一部分):

尝试在正确数组以外的任何对象上使用此函数都会失败,并导致编译器错误,而不是像代码那样默默地给出误导性的值


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

Tomalak Geret'kal是正确的

对于您想要的功能,您可以使用:

void DoSomethingWithArray(int* arr, size_t n)
{
    cout << "Function Array length is: " << n << endl;
}

template< size_t n >
inline void DoSomethingWithArray(int (&arr)[n])
{
    // n == sizeof(arr)/sizeof(int)
    DoSomethingWithArray( arr, n );
}
void DoSomethingWithArray(int*arr,size\u t n)
{

cout…指针的大小通常是
int
的大小,或者是它的两倍,所以你可能会一直得到1或2(取决于平台)。@Tomalak,这就是我猜测的。--谢谢你很好的模板建议,谢谢(我不知道也会产生常量模板参数!)@sehe:你的意思是“推断”?:)归纳,推断,推断,检测,模式匹配,填充,识别,解析:)推断,有,是的,谢谢你已经有很多重复了,例如@PaulR:虽然确实有很多重复,但那不是其中之一。这个问题是关于指向动态分配内存块的指针,而这个问题是关于衰减到p的按值传递数组的ointer行为。答案是一样的,但问题不是。@Tomalak:你确定我们在看同一个问题吗?在最初得到一个糟糕的示例副本后,我确实更新了我的评论,但我认为这肯定是一个有效的副本。无论哪种方式,都有很多选择。@PaulR:我在看你的预编辑评论。这是一个平衡。额外的代码可能不比一个新的堆栈框架差。取决于用例。@ Timalk Geel'Kal:当然,我不认为创建额外的堆栈框架是一个很好的选择。显然,我依赖于直接嵌入单个函数调用,而不是实例化每个数组大小值的函数-SaEN编译器W。如果开启了优化,我们会一直这样做。即使没有优化,用一个调用或任何其他小动作(每n个值)实例化小函数也是可以的,但如果函数太大,这是不可接受的。好的一点;我已经忘记了这一点!
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 arr[3] = {1, 2, 3};
template <size_t N>
void PrintArrayLength(int (&arr)[N])
{
    cout << "Function Array length is: " << sizeof(arr)/sizeof(int) << endl;
}
template <typename T, size_t N>
size_t length_of_array(T (&)[N]) {
   return N;
}
void DoSomethingWithArray(int* arr, size_t n)
{
    cout << "Function Array length is: " << n << endl;
}

template< size_t n >
inline void DoSomethingWithArray(int (&arr)[n])
{
    // n == sizeof(arr)/sizeof(int)
    DoSomethingWithArray( arr, n );
}