今天写了个非常小的测试程序,看似没多大用处,其中包含的思想还是蛮多的,来看看吧,首先贴出源码
#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 << " ";
}