多维数组与指针

写到3.43的时候,想了两天才做出答案,特此记录一下。

 

题目是编写三个不同版本的程序,令其均能输出ia的元素。版本一是用范围for语句,版本二使用普通for+下标运算符,版本三是用for语句+指针。

以下是试了两天试出的结果。。。

/*************************************************************************
    > File Name: 3_43.cpp
    > Author: Shadow Hu 
    > Mail: [email protected]
    > Created Time: 2014年08月19日 星期二 15时39分50秒
 ************************************************************************/

#include<iostream> using namespace std; int main(){ int ia[2][3] = {1,2,3,3,2,1}; //version 1 for(int (&i1)[3]:ia){ for(int j1:i1) cout<<j1<<" "; }; cout<<endl; //version 2 for(int i2 = 0;i2 < 2;++i2){ for(int j2 = 0;j2 < 3;++j2) cout<<ia[i2][j2]<<" "; } cout<<endl; //version 3 for(int (*i3)[3] = ia;i3 != &ia[2];++i3){
//also  for(int (*i3)[3] = begin(ia);i3 != end(ia);++i3){
for(int *j3 = *i3; j3 != *i3+3 ;++j3)
//also for(int *j3 = begin(*i3); j3 != end(j3);++j3)   cout
<<*j3<<" "; } return 0; }

 

版本二比较好写,就不再赘述。主要是版本一和版本三的问题。

版本一:

最开始好像是直接用一个int *指针去遍历ia,然后花线最后只打印出来了1和3,通过多方考究(其实是直到写到版本三才知道),在多维数组{{1,2,3},{3,2,1}}中,ia指向了首元素,而ia+1呢,指向的是第二个一维数组的首元素。所以只用一个指针是显然不能打印出所有的元素的。回到课本上,里面有一个example, int (*p)[4] = ia,p指向了一个含有4个整数的数组(课本上ia[3][4])。所以我在想,是不是一旦这样定义,加了一个[4]以后,就会给p开辟出一个四个整数的空间。然后我就在版本一的初始版本上加上了[3],和一个二重循环。显而易见,这样就犯了书上说的错误了,第二重的范围是一个指针,编译错误啦。。。于是照着书上,把*改成&,于是,终于不跳error了。。。

ps:还有一个问题,范围for循环里,item的类型可以是各种,可以是指针,也可以是int,由于书中一直是以auto让编译器识别,让我误以为item只能是指针。。。其实是可以是各种啦

 

 

版本三:

版本三真是纠结啊,一开始想省事用begin(ia)和end(ia),并且起初还不知道ia和ia+1的问题,结果begin括号中的类型怎么试都不匹配,于是放弃begin和end,改用ia和ia+n这样的写法。然后了解到上面的红字说的问题,于是立马改写一重循环,那么ok,一重循环不再跳error。那么二重循环一开始是写成int *j3 = i3,我想都是指针嘛,这样写应该不会有什么问题吧,于是又出问题了。。。于是我又继续改,加&加*怎么着都试过了。。。于是又再查阅资料花线,妈蛋一个*处理的是每个一维数组,再加一个*就变成处理一维数组里的每个元素。ok,于是问题解决。就在刚才想把begin和end加上去,发现完全没问题,知道了红字的两个问题以后,就一次性解决了。还是begin和end方便啊,省了好多手指上的力气!

 

于是,此役后,明白了一个问题,要多去考究资料嘛,不要总想着去找答案。。。找到了答案也不知道人家是怎么想的。。。

 

/************************************************************************************************************************************************************************************************************************************************************/

写到3.44的时候对比了一下加了别名和没加别名的两个程序。

 

/*************************************************************************
    > File Name: 3_44.cpp
    > Author: Shadow Hu
    > Mail: [email protected]
    > Created Time: 2014年08月19日 星期二 21时57分19秒
 ************************************************************************/

#include<iostream>
using namespace std;

int main(){
    int ia[2][3] = {1,2,3,3,2,1};
    using row =int[3];
    
    //version 1
    for(row &i1: ia ){
 //for(int (&i1)[3]:ia){ 下同
for(int j1:i1){ cout<<j1<<" "; } } cout<<endl; //version 3 for(row *i3 = begin(ia);i3 != end(ia);++i3){
 //for(int (*i3)[3] = begin(ia);i3 != end(ia);++i3){ 下同
for(int *j3 = begin(*i3);j3 != end(*i3);++j3) cout<<*j3<<" "; } return 0; }

 

 

 

 于是乎,花线在这里,真的是row = int       [3]的啊!

 

 

另附:三个种用法的对比图

多维数组与指针