c++函数输入参数为数组时怎么求长度

如果你只想知道答案:

静态数组,如果在函数里定义一个静态数组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二维数组求长度不严谨,怕写多了跑题了。。。

 

如果你还不懂:

直接问我

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值