<b>细论数组维度(dimension)的计算</b>[VC/C++编程]
本文“<b>细论数组维度(dimension)的计算</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
我们常常需求知道先前定义的数组维度,或是为了对其举行循环遍历,或是别的.当我们显示初始化数组而没有指定其维度时特别如此:
intis[]={1,2,3};
有C语言开辟经验的读者大概常常利用以下方法来实现:
intdimension=sizeof(is)/sizeof(is[0])
这在大部份情形下都工作得很好.只是敲的键盘次数有点多.所以,有了以下这个宏的呈现:
#defineDIM(a)(sizeof(a)/sizeof(a[0]))
目前就便利多了.但是仍然不完善.考虑下列情形:
宏的参数传入一个重载了operator[]操作符的自定义对象
宏的参数传入一个指针
我们先看第一种情形.当传入一个重载了operator[]操作的对象时(大概您会说:“等等,我绝对不会这样干的.”但是谁会为您担保呢?),编译器并不会给您报错,乃至鄙吝到一条告诫都不会给出.不相信我吗?把以下代码片段拷贝到您的IDE中试试吧.
std::vector<int>vi;
cout<<DIM(vi)<<endl;
“岂有此理,我要把我这该死的编译器换掉!”您先别急,据我所知,目前还没有哪家厂商的编译器会给出错误或告诫提醒,最重要的是,编译器根本没有这个责任.
在办理以上这个问题前,我们先插入一点有关C++数组与指针的知识.
很多情形下,C++中的数组可退化为指针.以下就是一个例子:
intis[]={1,2,3};
int*pi=is;
我们拜候数组时有两种方法:一种称为下标式拜候,另一种称为偏移量拜候.比方,要获得数组is的第二个元素,可辨别采取is[1]和*(is + 1),两种方法等价.实际上,指针也有着一样的特点,也就是说pi[1]或*(pi + 1)也是获得第二个元素.更风趣的是,C++中的内建(build-in)下标式拜候还可倒过来写,即is[1]与1[is]等价.吃惊吧.夸大一下,这种特点只有在内建的下标式拜候时才精确,换句话说,自定义并重载了operator[]操作符的范例是不具有这种特点的.通过vi[1]方法可获得vector的第二个元素,而当您写出1[vi]这样的代码时编译器就报错.
好了,回到我们的问题,我们可以借助上面所提到的C++特点来办理.把DIM宏的定义改正成:
#defineDIM(a)(sizeof(a)/sizeof(0[a]))
第一个问题已被圆满办理.
以上是“<b>细论数组维度(dimension)的计算</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |