随笔 - 1, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

访问数组的下标法和指针法的区别

    本文源自《C++沉思录》第12章,添油加醋一番,仅供娱乐。

    在C++中,访问一个数组中的元素有两种方法,一种使用下标访问,另一种是用指针,代码写法如下

    void f(int& i);  // 假设存在这样一个函数
    int a[N];        // 这是一个数组

    // 下标法遍历整个数组
    for (int i = 0; i < N; ++i) {
        f(a[i]);
    }

    // 指针法遍历整个数组
    for (int* p = a; p < a + N; ++p) {
        f(*p);
    }

    很明显的区别是:下标写法比较易懂,程序意图也很清晰。而指针写法会引起对指针头疼者的反感,但是指针版本的速度会比较快一点——虽然差别不是很大。

    更深层次的区别是:下标法中使用的下标表示的就是一个数字,这个下标并不一定只用来索引数组,还可以拿它做其他事情,比如你想初始化一个数组:值为下标的平方。那么使用下标就可以这样写:a[i] = i * i; 如果用指针方法必须另外再定义一个整数——这使得不但指针要递增,这个整数也要递增,没有下标法简洁。

    下标法要指定一个数组中的元素,必须依赖数组的名字和数组中元素的位置:可以用一个下标访问两个数组中位置相同的元素,在复制数组的时候可以这样使用:a[i] = b[i]; 指针法不需要了解数组的名字,也不需要知道元素的位置,指针本身就包含了全部的信息,能够从头到尾依次访问整个数组的元素。

    这个区别本质上是设计上的区别,而并非效率上的考虑,如果使用下标使得程序更加简单易懂而且逻辑合理,那么就使用下标,而且指针法还有一定的隐患:如果数组已经被销毁,指向数组元素的指针则会失效,指向非法内存。

    其实平时基本不会用指针来遍历数组,大多数都不只是简单地遍历数组,而是要利用下标值进行某些操作,而像复制数组等简单操作可以利用STL的模板算法搞定。下标法的好处相比指针的不方便性使得指针法遍历不常使用。

posted on 2008-12-31 22:12 Ajey 阅读(1895) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理