findint数组的大小

如何find一个int数组的大小? 例如:

int list[]={1,5,7,8,1,1,4,5,7,7,7,8,10,20}; 

如何到列表的大小?

我知道的字符数组。 我们可以使用strlen(array)来查找大小,或者在数组末尾检查'\0'

但是对于int数组,检查'\0'似乎不起作用。

问题!!!!!!!!!! sizeof(array)/sizeof(array[0])只适用于主? 如果我在一个函数里面使用它。 例如:

  #include <iostream> using namespace std; void size(int arr1[]){ int size; size=sizeof(arr1)/sizeof(arr1[0]); cout<<size<<endl; } int main(){ int list_1[]={1,5,7,8,1,1,4,5,7,7,7,8,10,20}; size(list_1); return 0; } 

它不能打印正确的尺寸?

尝试这个:

 sizeof(list)/sizeof(list[0]); 

因为这个问题被标记为C ++,所以总是推荐在C ++中使用std::vector而不是使用传统的C风格的数组。


编辑:(因为这个问题已经编辑)

一个array-type被隐式转换成一个pointer-type时,你传递给一个函数。 看看这个。

为了在任何函数中正确地打印一个数组的大小,通过引用该函数来传递数组(但是您需要事先知道该数组的大小)

编辑2 :亚当想知道如何通过引用传递数组

 #include <iostream> template<typename T,int N> //template argument deduction void size(T (&arr1)[N]) //Passing the array by reference { size_t size; size=sizeof(arr1)/sizeof(arr1[0]); std::cout<<size<<std::endl; //Correctly prints the size of arr //EDIT std::cout<<N; //Correctly prints the size too [cool trick ;-)] } int main() { int list_1[]={1,5,7,8,1,1,4,5,7,7,7,8,10,20}; size(list_1); return 0; } 

这个“标准”C方法是

 sizeof(list) / sizeof(list[0]) 

你可以使用boost::size ,这基本上是这样定义的:

 template <typename T, std::size_t N> std::size_t size(T const (&)[N]) { return N; } 

请注意,如果要将大小用作常量expression式,则必须使用sizeof a / sizeof a[0]成语或等待下一版本的C ++标准。

不能这样做dynamic分配的数组(或指针)。 对于静态数组,可以使用sizeof(array)以字节为单位获取整个数组的大小,并将其除以每个元素的大小:

 #define COUNTOF(x) (sizeof(x)/sizeof(*x)) 

为了获得一个dynamic数组的大小,你必须手动跟踪它,并用它来传递它,或者用一个sentinel值来终止它(比如在null结束string中的'\ 0')。

更新:我意识到你的问题被标记为C ++而不是C.你应该一定要考虑在C ++中使用std::vector而不是数组,如果你想要传递的东西:

 std::vector<int> v; v.push_back(1); v.push_back(2); std::cout << v.size() << std::endl; // prints 2 

既然你已经把它标记为C ++,值得一提的是有一个比C风格的macros更好的方法:

 template <class T, size_t N> size_t countof(const T &array[N]) { return N; } 

这样做的好处是,如果你不小心尝试传递数组以外的东西,那么代码根本就不会编译(而传递指向Cmacros的指针将会编译,但是会产生一个不好的结果,缺点是,给你一个编译时常量,所以你不能这样做:

 int a[20]; char x[countof(a)]; 

在C ++ 11或更新版本中,可以添加constexpr来获得编译时常量:

 template <class T, size_t N> constexpr size_t countof(const T &array[N]) { return N; } 

如果你真的想在老版本的编译器上支持这个function,AFAIK最初由Ivan Johnson发明了一种方法:

 #define COUNTOF(x) ( \ 0 * sizeof( reinterpret_cast<const ::Bad_arg_to_COUNTOF*>(x) ) + \ 0 * sizeof( ::Bad_arg_to_COUNTOF::check_type((x), &(x)) ) + \ sizeof(x) / sizeof((x)[0]) ) class Bad_arg_to_COUNTOF { public: class Is_pointer; class Is_array {}; template<typename T> static Is_pointer check_type(const T*, const T* const*); static Is_array check_type(const void*, const void*); }; 

这就像使用Cmacros一样使用sizeof(x)/ sizeof(x [0])来计算大小,所以它给出了一个编译时常量。 不同的是它首先使用了一些模板魔法,如果你传递的不是数组的名字,就会导致编译错误。 它通过重载check_type来为一个指针返回一个不完整的types,但是一个完整的数组types。 然后(真的很棘手的部分),它根本不调用该函数 – 它只是函数返回的types的大小,对于返回完整types的重载为零,但不允许(强制编译错误)为不完整的types。

国际海事组织,这是一个非常酷的模板元编程的例子 – 尽pipe诚实,结果是没有意义的。 如果你使用的是数组,那么你真的只需要把这个大小作为一个编译时间常量,在任何情况下你都应该避免使用它。 使用std::vector ,可以在运行时提供大小(如果需要,可以resize)。

除了Carl的回答,“标准”C ++方式不是使用C int数组,而是像C ++ STL std::vector<int> list ,您可以查询list.size()

当你传递任何数组到一些函数。 你只是通过它的起始地址,所以为了它的工作,你必须通过它的大小也正常工作。 这与我们在命令行中通过argc和argv []的原因是一样的。

你必须使用sizeof()函数。

代码片段:

 #include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); int arr[] ={5, 3, 6, 7}; int size = sizeof(arr) / sizeof(arr[0]); cout<<size<<endl; return 0; }