多维数组与指针

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

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

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

#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方便啊,省了好多手指上的力气!

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

多维数组与指针

时间: 2024-10-12 04:32:18

多维数组与指针的相关文章

程序猿之--C语言细节13(二维数组和指针,&amp;*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)

主要内容:二维数组和指针,&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

C语言 二维数组与指针笔记

今天分析了C语言二维数组和指针的基本理解,感觉有点懵...代码记录一下,如果有大神临幸发现哪里有误,欢迎指正~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> //void func(int p[][]) //这样写等同于void func(int **p) p++移动了四个字节,(*p)++移动了四个字节,不符合二维数组规律 //{ //} //列优先输出的函数(即竖着输出) void func

直观理解C语言中指向一位数组与二维数组的指针

一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我

例看二维数组,指针,二维数组指针

例程: /****************************************************** * * 文件名:例程 * * 文件描述:例看二维数组,指针,二维数组指针 * * 创建人:Jesse * * 版本号: * * 修改记录: * ******************************************************/ #include <stdio.h> #define ROW 3 #define LINE 3 void main(voi

程序员之--C语言细节13(二维数组和指针,&amp;amp;*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)

主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

多维数组和指针探讨

??????? 前段时间刷题中,无意发现自己对多维数组和指针的关系不是很明确,开始google,没发现太靠谱的,于是翻书,果然在<C Primer Plus>中找到一段,分析的如此透彻,是不是这个太基础了,以至于别人都不愿意在网上写出来,以下摘自书中,并加上自己的理解: ? 指针和多维数组有什么关系?为什么我们需要知道它们之间的关系?函数是通过指针来处理多维数组的,因此在使用这样的函数之前,您需要更多地了解指针.对于第一个问题,让我们通过几个例子来找出答案.为简化讨论,我们采用比较小的数组.假

二维数组及指针

首先,看一维数组. []符号是下标运算符,a[i]就是*(a+i) 那么a[i][j] 就是*(a[i]+j)=*(*(a+i)+j) 本人对二级和多级指针的理解:1.抽象上说二级指针的内容是地址的地址.变量A好像跟你捉迷藏似的,你要想找到A,你先得去一个地方把A的地址给找出来,然后再根据这个地址找到A.就类似武侠电影里的宝藏,你要先去一个人的背上发现藏宝图,然后再根据藏宝图里画的地址找到宝藏,在这里,这个人的背就是一个最外层的地址,藏宝图就是内层的地址.2.对于二级指针和多级指针,定义时,我们

C语言--指向多维数组的指针和指针数组

#include <stdio.h> //void show(char *p[]); void show(char s[][10]); int main(){ char s[3][10]={"123","abc","xyz"}; char *p[10]; //指针数组要循环复制 p[1] = s[1]; char (*ps)[]; ps = s; } #include <stdio.h> #include <stri

二维数组和指针

二维数组和指针⑴ 用指针表示二维数组元素.要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题.我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了.而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组 下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了.设p是指向数组a的指针变量,若有:p=a