我们经常需要知道先前定义的数组维度,或是为了对其进行循环遍历,或是其它。当我们显示初始化数组而没有指定其维度时尤其如此:
int is[]={1,2,3};
有C语言开发经验的读者可能经常使用如下方式来实现:
int dimension=sizeof(is)/sizeof(is[0])
这在大部分情况下都工作得很好。只是敲的键盘次数有点多。所以,有了如下这个宏的出现:
#define DIM(a)(sizeof(a)/sizeof(a[0]))
现在就方便多了。但是依然不完美。考虑下列情况:
宏的参数传入一个重载了operator[]操作符的自定义对象
宏的参数传入一个指针
我们先看第一种情况。当传入一个重载了operator[]操作的对象时(也许您会说:“等等,我绝对不会这样干的。”可是谁会为您担保呢?),编译器并不会给您报错,甚至吝啬到一条警告都不会给出。不相信我吗?把如下代码片段拷贝到您的IDE中试试吧。
1.std::vector<int> vi;2.cout << DIM(vi) << endl;
“岂有此理,我要把我这该死的编译器换掉!”您先别急,据我所知,目前还没有哪家厂商的编译器会给出错误或警告提示,最重要的是,编译器根本没有这个责任。
在解决以上这个问题前,我们先插入一点有关C++数组与指针的知识。
很多情况下,C++中的数组可退化为指针。以下便是一个例子:
1.int is[] = {1, 2, 3};2.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宏的定义修改为:
1.#define DIM(a) (sizeof(a) / sizeof(0[a]))
第一个问题已被圆满解决。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, 对象
, sizeof
, operator
, c++设置维度数组
, 维度
, 一个
数组给您的文件
dimension w 维度战记、python查看数组维度、python 数组维度、数组维度、数组的维度,以便于您获取更多的相关知识。