细论数组维度(dimension)的计算

我们经常需要知道先前定义的数组维度,或是为了对其进行循环遍历,或是其它。当我们显示初始化数组而没有指定其维度时尤其如此:

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 数组维度、数组维度、数组的维度,以便于您获取更多的相关知识。

时间: 2024-08-03 15:13:15

细论数组维度(dimension)的计算的相关文章

JS编程建议——53:小心使用数组维度

建议53:小心使用数组维度在JavaScript中,数组在默认状态下是不会初始化的.如果使用[]运算符创建一个新数组,那么此数组将是空的.如果访问的是数组中不存在的元素,则得到的值将是undefined.因此,在JavaScript程序设计中应该时刻考虑这个问题:在尝试读取每个元素之前,都应该预先设置它的值.但是,如果在设计中假设每个元素都从一个已知的值开始(如0),那么就必须预定义这个数组.我们也可以为JavaScript自定义一个静态函数:Array.dim = function(dimen

关于php减少数组维度的问题 求大神支招

问题描述 关于php减少数组维度的问题 求大神支招 Array( [jwc_grades] => Array ( [0] => Array ( [2012] => Array ( [1] => Array ( [term_point] => 3.5 [term_average] => 88 [grades] => Array ( [0] => Array ( [jwc_grade_id] => 5 [course] => 阿什顿 [point]

c++-C++数组维度提示不是常量,是按照教科书编程的,是不是编译器的原因。

问题描述 C++数组维度提示不是常量,是按照教科书编程的,是不是编译器的原因. #include #include using namespace std; int main() { char ch1[] = "woainidan"; char ch2[] = "iloveyou"; char result[strlen(ch1) + strlen(ch2)]; strcpy(result, ch1); strcat(result, ch2); cout <&

智能指针-c++ excel dll 数组输入后如何对数组元素值进行计算?

问题描述 c++ excel dll 数组输入后如何对数组元素值进行计算? 问题是这样的 IDE:visual c++ 2013 community excel:2010 目的:编写excel dll 目前阶段:实现了在excel中单元格输入,单元格输出的函数编写,如a+b 现在想要尝试数组/矩阵输入后,经过一定的计算,以数值输出到单元格,如得到这个数组所有元素的总和之类的. 已知输入 #import "C:Program Files (x86)Common Filesmicrosoft sha

Java数组排序基础算法,二维数组,排序时间计算,随机数产生

import java.util.Arrays; //包含Arrays import java.util.Random; public class HelloWorld { public static void main(String[] args){ // Scanner s = new Scanner(System.in); // System.out.println("请输入一个数字"); // int num = s.nextInt(); //打印数组 int []a = {1

C++编程中new运算符的使用学习教程_C 语言

new运算符用作从自由存储为 type-name 的对象或对象数组分配内存,并将已适当分类的非零指针返回到对象. [::] new [placement] new-type-name [new-initializer] [::] new [placement] ( type-name ) [new-initializer] 备注如果不成功,则 new 将返回零或引发异常:有关详细信息,请参阅 new 和 delete 运算符. 通过编写自定义异常处理例程并调用 _set_new_handler

Shell或命令行计算数组或文件的行数和列数

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1630920 (一)闲聊Linux Shell 编程 都说中国文化博大精深(例如汉字),但作为操作系统中的佼佼者,Linux虽然时间并不长,但同样也是博大精深.谁也不敢说自己已经熟练的掌握了Linux中所有的内容,除了知识点众多以外,快速的发展和更新使得Linux越来越强大,也使得Linux在短时间内越来越难掌握.所

php计算多维数组中所有值总和的方法_php技巧

本文实例讲述了php计算多维数组中所有值总和的方法.分享给大家供大家参考.具体实现方法如下: php 内置函数 array_sum() 函数返回数组中所有值的总和,只能返回一维数组的总和: 计算多维数组所有值的和就要自定义函数了: function get_sum($array) { $num = 0; foreach($array as $k => $v) { if(is_array($v)) { $num += get_sum($v); } } return $num + array_sum

理解C语言——从小菜到大神的晋级之路(9)——多维数组

本节视频链接:点击这里 1.多维数组的定义和结构         一个数组中可以支持各种数据类型,那么一个数组中的每一个元素同样也可以是一个数组.对于上次提到的一维数组,其每个元素都是一个简单数据类型的对象,其结构如同一个一维的数据排列:对于一个二维数组,它的每一个元素都是一个一维数组,其形式如同一个二维的表格,表格的宽度是其中作为数据元素的一维数组的长度,高度是这样的一维数组的个数.简而言之,二维数组的结构是一个矩阵的形式.         例如,我们声明下面这样的一个二维数组: int nM