以下
#include <iostream>
void printArraySize ( int * arr )
{
std::cout << sizeof(arr)/sizeof(int);
}
int main ()
{
int arr [] = {1, 2, 3, 69203};
printArraySize(arr);
return 0;
}
输出1
(证明:http://codepad.org/yKG3mZIz)。解释这个废话。一旦进入函数,数组是否会忘记它的大小?根据我的理解,传递arr
,一个记忆地址,一个数字,只是意味着复制该数字。所以sizeof(arr)/sizeof(int)
应该在函数内外表示相同的东西。
答案 0 :(得分:1)
在main
中,arr
是一个数组,sizeof
会产生数组的大小。
在printArraySize
中,arr
是指向int
的指针,sizeof
生成指向int
对象的指针的大小。
在C中,您无法将(直接)数组传递给函数,您只能将指针传递给数组的第一个元素。要在printArraySize
中获取数组的大小,您需要将其显式作为参数传递给函数。
在C ++中,您可以通过引用传递C数组,但您不应该首先使用C数组,而是使用std::array
或std::vector
。
答案 1 :(得分:0)
这是因为你检查sizeof ( int*)
是sizeof指向int的指针。这是因为arr传递给了
int arr [] = {1, 2, 3, 69203};
printArraySize(arr);
衰减到指向int的指针。它只是一个指向整数的指针,是数组的第一个元素。
C
为了做你想要实现的目标,经常使用一个宏(用于静态数组):
#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
示例:
int arr [] = {1, 2, 3, 69203};
printf( "%d", ARRAY_SIZE(arr));
C ++
template<class T, size_t n>
size_t array_size( T(&)[n]) {
return n;
}