如果你只想知道答案:
静态数组,如果在函数里定义一个静态数组A,则在此函数里可以通过sizeof(A)/sizeof(A[0])求数组长度。
如果数组A在函数外定义,并且作参数传入函数,怎么在函数里求其长度?——不好求,一般我们会再多传入一个参数记录长度(或者可以将函数参数设为引用,不过在参数类型上有一点问题,目前可以用函数模板解决,下面有例子)
动态数组,(1)用new创建的动态数组作参数时,在函数里同样也不能求长度,因此一般我们也会再多传入一个参数记录长度。
(2)参数为vector数组时,可以通过vector.size()得到数组长度。
如果你想知道为什么:
1.静态数组
如果在函数中定义数组A,sizeof(A)是所有数组元素所占用的内存空间字节数,因为编译器在将 C 代码转换成汇编代码时,自动将其替换成了实际的数值,因此可以通过sizeof(A)/sizeof(A[0])计算数组大小。
但是A实际是一个指针,表示的是这个数组首个元素的地址,不信你可以试着尝试cout<<A<<endl,你会发现输出的是一个地址。所以如果此数组在函数外定义,然后作为函数的输入参数传入,则传入的A只能表示指针,所以此时sizeof(A)为A[0]的地址的长度(x86地址长度为32位,即4个字节)。所以sizeof(A)/sizeof(A[0])为1(x86)。所以在我们传入这种数组做参数时,通常同时会再多传一个参数记录数组的长度。
例如:
void main()
{
int a[] = { 6,-1,3,-4,-6,9,2,-2,5 };
int n = sizeof(a)/sizeof(a[0]);
cout << n << endl;
}
此时n为9,
int a[] = { 6,-1,3,-4,-6,9,2,-2,5 }
void arr(int a[])
{
int n = sizeof(a)/sizeof(a[0]);
cout << n << endl;
}
此时n为1(x86)或2(x64)
类模板+引用:
template<class T>
void arr(T &a)
{
int n = sizeof(a) / sizeof(a[0]);
cout << n << endl;
}
int main()
{
int a[] = { 6,-1,3,-4,-6,9,2,-2,5 };
arr(a);
}
输出为9。
此外我们还可以定义一个类(或结构体),把数组和数组长度同时放入类里,这样只需要将这个类传入即可。完整代码如下:
class arry {
public:
int* t;
int len;
};
void arr(arry* a)
{
cout << "len:" << a->len << endl;
for (int i = 0; i < a->len; ++i) {
cout << a->t[i] << "\t";;
}
}
int main()
{
arry* a;
a = (arry*)malloc(sizeof(arry));
int b[6] = {0,1,2,3,4,5};
a->len = sizeof(b) / sizeof(b[0]);
a->t = b;
arr(a);
}
2.动态数组
(1)new
int *a = new int[10]();
在new初始化的动态数组中,a始终表示一个指向数组a第一个元素的指针,作参数传入函数时也只传入的一个指针。所以a并不会包含任何和数组长度相关的东西,sizeof(a)的值为8(x86)或16(x64)。所以作参数传入函数时也需要多加一个数组长度的参数。
(2)vector
vector就简单了,有专门求长度的方法,即vector.size()。
//一维数组
vector<int>v[10];
void arr(vector<int>v)
{
int len=v.size();
}
//二维数组
vector<int>v[10][10];
void arr(vector<int>v)
{
int len=v.size()*v[0].size();//v.size()为数组第一个维度的长度,v[0].size()为数组第二个维度的长度
}
ps:上面vector二维数组求长度不严谨,怕写多了跑题了。。。
如果你还不懂:
直接问我