关于c\c++中统计数组长度的一些问题

首先先谈一谈关于在C、C++中关于数组长度的问题。

在C、C++中除字符型数组中的strlen()以外,没找到解决数组长度的函数。
在Python中有对list定义的内置函数len(),在C中没有明码标价的这种函数。
解决数组长度的问题,对一些算法如:二分算法、快速查找等都有很大影响。数组的长度代表着执行循环终止的条件。

而解决数组长度的方法就是运用sizeof()运算符(记住它不是个函数),sizeof计算的是该类型的字节长度,(由于位数不一样,在不同电脑算出来的结果也是不一样的。)sizeof(数组名) = 整个数组所占的字节数。
sizeof(数值名[0])= 第一个数所占的字节数。

整个公式为:
数组长度 = sizeof(数组名)/sizeof(数组名[0])

在你兴奋的找到怎么计算数组长度的同时,请你沉下心来仔细阅读下列代码,看看它是否正确,并建议在自己的电脑上进行试验。
#include<iostream>
using namespace std;
int len_(int *a);
int main() {
int a[]={1,2,3,4,5,6,7,8,9,10};
int answer=0;
answer = len_(a);
cout<<answer<<endl;
}
int len_(int *a)
{
int len =0;
len = sizeof(a)/sizeof(a[0]);
return len;
}

如果你发现问题了,再试试这个。
#include<iostream>
using namespace std;
int main() {
int a[]={1,2,3,4,5,6,7,8,9,10};
int answer=0;
answer = sizeof(a)/sizeof(a[0]);
cout<<answer<<endl;
}

有没有感到一丝神奇的地方?相同的运算方法,为什么结果不一样?难道使用 函数就搞坏了吗?

不使用函数的确是没有任何问题的,使用函数时一定要注意sizeof的使用,通过使用函数,把数组的地址赋给函数,实现传值调用,但注意的是,这时候你在函数定义的数组名是原来的地址,在函数这一片新的内存空间中,使用sizeof对数组名进行运算,只是计算了数值名这个指针的字节长度。这就是为什么会出现2的原因。(指针的长度与语言没关,与系统的寻址能力有关,在64位以后为8字节,感兴趣的话,可以自己在编译器中试一试)

8(指针的字节长度)/4(int的字节长度)

在使用C程序计算数组长度时,直接用公式运算就不会出现问题了。<-^^->

补充一下,在C中为了方便可以使用“黑魔法”——define宏定义 来解决这个问题,在C++中可以使用模板和数组引用来解决这个问题。(这个以后再谈)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值