现在的位置: 首页 > 综合 > 正文

指针输出数组元素(偶得试手,不值一提)

2014年08月24日 ⁄ 综合 ⁄ 共 734字 ⁄ 字号 评论关闭

今天写了个非常小的测试程序,看似没多大用处,其中包含的思想还是蛮多的,来看看吧,首先贴出源码

#include <iostream>
using namespace std;

int main(int argc, const char *argv[])
{
    int b[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
    int *p1;
    for (p1 = &b[0][0]; p1 < &b[0][0] + 12; p1 ++) {
        cout << *p1 << " ";
    }
    cout << endl;
}

上面的是粗略的版本,一般人都能想到,b[0][0]代表0行0列的值,&b[0][0]自然是0行0列的地址,p++指向下一个元素的地址,如此肯定能输出数组元素

但是,不是还有一句话说,数组名表示数组的首地址(首元素的地址),又有而为数组又可看成数组的数组,所以数组可以看成b[0],b[1],b[2]三个元素组成,b[0]又是由4个元素组成的数组,b[0]可以看做而为数组第一行的首地址,如此改进的版本就出来了,修改for循环为下面:

for (p1 = b[0]; p1 < b[0] + 12; p1 ++) {
        cout << *p1 << " ";
  }

思考一下,能否写成p1 = b?结论是不行的.原因是b指向的是b[0](二维数组的首行,即指向一个一维数组),与p1的类型不匹配(p1是指向整型数据的指针变量),编译时出错,

这种思想虽然错误,但是为代码的改进还是提供的思路,即b指向b[0],所以代码的改进就这样呼之欲出

因为b[0]与*b无条件等价,所以还可以继续改进为下面的代码:

  for (p1 = *b; p1 < *b + 12; p1 ++) {
        cout << *p1 << " ";
   }

抱歉!评论已关闭.