指针遍历二维数组的三种方式

#include<cstdio>

void func1(int p[][3], int row, int col){

    //第一种遍历方式 传递 二维数组名(行指针)
    //通过下标遍历 简单明了

    for(int i=0; i<row; ++i){
        for(int j=0; j<col; ++j)
            printf("%4d", p[i][j]  );
        printf("\n");
    }
    printf("\n\n");
    return;
}

void func2(int* p, int row, int col){

    //第二种遍历方式 传递 第一行的首地址
    //因为二维数组在内存中是连续存放的
    //可以将它作为一维数组遍历, 依次解引用该行地址 完成遍历

    for(int i=0; i<row; ++i){
        for(int j=0; j<col; ++j)
            printf("%4d", *(p + i*3 + j)   );
        printf("\n");
    }
    printf("\n\n");
    return;
}

void func3(int (* p)[3], int row, int col){

    //第三种遍历方式 传递 过来的 行指针 作为 数组指针
    //同第一种方式

    for(int i=0; i<row; ++i){
        for(int j=0; j<col; ++j)
            printf("%4d", *(*(p+i)+j)   );
        printf("\n");
    }
    printf("\n\n");
    return;
}

int main(){

    int a[4][3]={ {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} };

    //作为数组名a 它实际上是一个 行指针/地址
    //要想得到某行某列的值
    //首先应该解引用 行指针/地址 得到 某行的起始位置(列指针/地址)
    //然后再解引用 列指针/地址 得到 数组元素的值




    //下标运算 的本质
    //实际上就是对数组特定位置上的 元素地址 进行解引用

    printf("%d\n", *(*(a+0)+0)  );
    printf("%d\n", a[0][0]    );


    func1(a, 4, 3);

    func2(*a, 4, 3); //解引用a得到 第一行的首地址

    func3(a, 4, 3);

    return 0;
}

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
今年9月份参加计算机二级考试的同学请转载 作者:天使~之戀 已被分享1次 评论(0) 复制链接 分享 转载 删除 下面的138道题目,在二级考试中命中率极高。 一、选择题 (1) 下面叙述正确的是(C) A. 算法的执行效率与数据的存储结构无关 B. 算法的空间复杂度是指算法程序中指令(或语句)的条数 C. 算法的有穷性是指算法必须能在执行有限个步骤之后终止 D. 以上三种描述都不对 (2) 以下数据结构中不属于线性数据结构的是(C) A. 队列 B. 线性表 C. 二叉树 D. 栈 (3) 在一棵二叉树上第5层的结点数最多是(B) 注:由公式2k-1得 A. 8 B. 16 C. 32 D. 15 (4) 下面描述中,符合结构化程序设计风格的是(A) A. 使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑 B. 模块只有一个入口,可以有多个出口 C. 注重提高程序的执行效率 D. 不使用goto语句 (5) 下面概念中,不属于面向对象方法的是 (D) 注:P55-58 A. 对象 B. 继承 C. 类 D. 过程调用 (6) 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是(B) A. 可行性分析 B. 需求分析 C. 详细设计 D. 程序编码 (7) 在软件开发中,下面任务不属于设计阶段的是(D) A. 数据结构设计 B. 给出系统模块结构 C. 定义模块算法 D. 定义需求并建立系统模型 (8) 数据库系统的核心是(B) A. 数据模型 B. 数据库管理系统 C. 软件工具 D. 数据库 (9) 下列叙述中正确的是(C) A.数据库是一个独立的系统,不需要操作系统的支持 B.数据库设计是指设计数据库管理系统C.数据库技术的根本目标是要解决数据共享的问题 D.数据库系统中,数据的物理结构必须与逻辑结构一致 (10) 下列模式中,能够给出数据库物理存储结构与物理存取方法的是(A) 注:P108 A. 内模式 B. 外模式 C. 概念模式 D. 逻辑模式 (11) 算法的时间复杂度是指(C) A. 执行算法程序所需要的时间 B. 算法程序的长度 C. 算法执行过程中所需要的基本运算次数 D. 算法程序中的指令条数 (12) 算法的空间复杂度是指(D) A. 算法程序的长度 B. 算法程序中的指令条数 C. 算法程序所占的存储空间 D. 算法执行过程中所需要的存储空间 (13) 设一棵完全二叉树共有699个结点,则在该二叉树中的叶子结点数为(B) 注:利用公式n=n0+n1+n2、n0=n2+1和完全二叉数的特点可求出 A. 349 B. 350 C. 255 D. 351 (14) 结构化程序设计主要强调的是(B) A.程序的规模 B.程序的易读性 C.程序的执行效率 D.程序的可移植性 (15) 在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段是(D) 注:即第一个阶段 A. 概要设计 B. 详细设计 C. 可行性分析 D. 需求分析 (16) 数据流图用于抽象描述一个软件的逻辑模型,数据流图由一些特定的图符构成。下列图符名标识的图符不属于数据流图合法图符的是(A) 注:P67 A. 控制流 B. 加工 C. 数据存储 D. 源和潭 (17) 软件需求分析阶段的工作,可以分为四个方面:需求获取、需求分析、编写需求规格说明书以及(B) 注:P66 A. 阶段性报告 B. 需求评审 C. 总结 D. 都不正确 (18) 下述关于数据库系统的叙述中正确的是(A) A. 数据库系统减少了数据冗余 B. 数据库系统避免了一切冗余 C. 数据库系统中数据的一致性是指数据类型的一致 D. 数据库系统比文件系统能管理更多的数据 (19) 关系表中的每一横行称为一个(A) A. 元组 B. 字段 C. 属性 D. 码 (20) 数据库设计包括两个方面的设计内容,它们是(A) A. 概念设计和逻辑设计 B. 模式设计和内模式设计 C. 内模式设计和物理设计 D. 结构特性设计和行为特性设计 (21) 下列叙述中正确的是(A) A. 线性表是线性结构 B. 栈与队列是非线性结构 C. 线性链表是非线性结构 D. 二叉树是线性结构 (22) 下列关于栈的叙述中正确的是(D) A. 在栈中只能插入数据 B. 在栈中只能删除数据 C. 栈是先进先出的线性表 D. 栈是先进后出的线性表 (23) 下列关于队列的叙述中正确的是(C) A. 在队列中只能插入数据 B. 在队列中只能删除数据 C. 队列是先进先出的线性表 D. 队列是先进后出的线性表 (24) 对建立良好的程序设计风格,下面描述正确的是(A) 注:P48 A. 程序应简单、清晰、可读性好 B. 符号名的命名要符合语法 C. 充
二级C上机习题1(1)【参考答案】 (1) 1  (2) 2*i  (3) (-1) 【考点分析】 本题考查:变量赋初值操作;for循环语句;累加运算。 【解题思路】 填空1:由fun函数整体结构可以看出k的作用是赋值,并累加各项前边的正负号,由于第一项是正的,因此赋给k的值为1。 填空2:此空下一行的表达式k*(2*i-1)*(2*i+1)/(t*t)累加的通向,k为正负号,由题目中公式可知t=2*i。 填空3:由于通向前边的正负号每次都要发生变化,因此k=k*(-1)。 (2) 【参考答案】 (1)k++; (2)if(m==k) 【考点分析】 本题考查:C语言中的语法格式,每个语句后面要以";"结尾;if语句条件表达式,区别条件表达式中==和=的区别。 【解题思路】 函数fun的功能是判断m是否为素数:m从2开始作为除数,并对m取余,若不存在一个数使得余数为0,则m为素数,程序的错误在于if(m=k)语句中的逻辑表达式写成了赋值语句。 (3) 【参考答案】 void fun(int a[],int n, int *max, int *d) { int i; *max=a[0]; *d=0; for(i=0;i<n;i++) /*将最大的元素放入指针max所指的单元,最大元素的下标放入指针d所指的单元*/ if(*max<a[i]) {*max=a[i];*d=i;} } 【考点分析】 本题考查:查找一维数组中的最大值及其下标,使用循环判断结构实现。指针变量的应用。 【解题思路】 要查找最大值及其下标需要定义两个变量,该程序直接使用形参max和d,由于它们都是指针变量,所以在引用它所指向的变量时要对它进行指针运算。循环语句用来遍历数组元素,条件语句用来判断该数组元素是否最大。 【解题宝典】 该程序考查求最大值,需要掌握以下语句: for(i=0;i<n;i++) /*将最大的元素放入指针max所指的单元,最大元素的下标放入指针d所指的单元*/ if(*max<a[i]) {*max=a[i];*d=i;}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值