写c语言的时候,遇到一个这样的问题:求一个3*3整型矩阵对角线元素之和。首先入手点是二维数组,于是我很快便写好了以下代码

#include #include int Sum(int p[][3])

{

int sum=0;

for(int i=0;i<3;i++)

{

for(int j=0;j<3;j++)

{

if(i==j||i+j==2)

{

sum+=p[i][j];

}

}

}

return sum;

}

int main()

{

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

int sum=Sum(a);

printf("%d ", sum);

system("pause");

return 0;

}

但是我想到如果只写这么一个函数,那么我就只能针对3*3的对角线之和的问题(不考虑长方形),但是我的初衷并不是这样。我希望写出这个函数的同时,可以对任意n²的矩阵都可以进行对角线和的输出,我觉得当定义一个二维数组的时候,和定义一维数组的形式和内存都是一段,二维数组只是设置了几个不同的几个记录来进行保存行列的值,所以在进行*(*p+1)和**(p+1)的时候来区分如以下情况

int main()

{

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

printf("%d %d %d %d", **a, **(a + 1), *(*a + 1), **a + 1);

printf("%d ", sum);

system("pause");

return 0;

}

因为二维数组的地址是连续存放的所以我打算在子函数里接收一个指向二维数组的二级指针int**arr和它的矩形的边值len,然后用人工的方式进行划分二维数组的区域,就有以代码

int Sum1(int **p,int n)

{

int sum = 0;

for (int i = 0; i < n-1; i++)

{

for (int j = 0; j < n-1; j++)

{

if (i == j || i + j == n-1)

{

sum += *(*p + i*(n - 1) + j);

}

}

}

return sum;

}

当我调用这个函数时首先就发生中断的情况,我发现我的理解有错误,既然相当于一维数组,那应该用一维指针就可以,而且在循环的过程因为受二维数组的影响,再循环的时候条件也有些错误,下面是我修改后的代码

int Sum1(int *p,int n)

{

int sum = 0;

for (int i = 0; i < n; i++)

{

for (int j = 0; j < n; j++)

{

if (i == j || i + j == n-1)

{

sum += *(p + i*(n ) + j);

}

}

}

return sum;

}

经过调用我发现就可以调用了,就是在调用的时候,因为二维数组并不是一个单纯的一级指针,所以在运行传参的时候需要一个强制转换的过程(int*),我想要取消这个强制转换的过程,做的更友好些,但是以我现在的思想和水平,还没有一个更好的方法,等今后有更好的方法或者新的思路,再重新写这个函数。

2017.8.24

可以用动态开辟的方法来创建数组,

int **cheil = (int **)malloc(sizeof(int*)* 5); //动态开辟二维数组存放数据

for (i = 0; i < 5; i++)

{

cheil[i] = (int *)calloc(4, sizeof(int)); //初始化

}

这样传入的指针是一个二级指针,就不需要强制转换了,但是又需要用户自己动态开辟才可以调用,不是动态开辟的数组一样还是用不了,继续学习,可能还会有新的方法吧。

c语言二维数组学习,C语言学习之二维数组的传参相关推荐

  1. c语言代码中调用系统命令行.sh shell脚本,linux shell system传参

    C语言代码中调用命令行: 1. 使用system(" 命令行 ");    --  执行完命令行后,会返回原先C代码的位置,继续执行. 2. 如果命令行中需要传参,使用 sprin ...

  2. 设备树学习(四、内核head.S对uboot传参的处理)

    之前在uboot学习中分析bootm原理的,我们知道了uboot启动内核是通过传入三个参数来启动的. kernel_entry为内核zImage在内存的首地址. 之前我们传的三个参数分别是: 0,芯片 ...

  3. python函数参数传递机制_Python 学习笔记(一) 理解Python的函数传参机制

    对于刚接触Python不久的新手,Python的函数传参机制往往会让人迷惑.学过C的同学都知道函数参数可以传值或者传地址.比如下面这段代码 点击(此处)折叠或打开 void func(int inpu ...

  4. 【C语言】二十二步了解函数栈帧(压栈、传参、返回、弹栈)

    阅读本文需要掌握的知识 熟练使用--c语言函数 进入正题前 首先我们为什么要学习函数的栈帧? 简单回答就是:增加内功 学习函数调用的底层代码,了解函数如何传参.如何返回 这样对于函数的使用有很大的帮助 ...

  5. 二维数组传参||传值

    先给出问题: 像下面这样的数组,在函数中如何传参?也就是说如何保证虚参与实参类型一致. char str_arr[3][10] = {"yes","no",&q ...

  6. [C] 数组指针、指针数组及数组传参

    指针 字符指针 数组指针 指针数组 一维数组传参 1. 整型数组 2. 指针数组 二维数组传参 一级指针传参 二级指针传参 小引 在指针的学习阶段,有不少同学都十分畏惧这个物什,甚至"谈指针 ...

  7. 【C语言进阶深度学习记录】三十 二维数组与二维指针

    文章目录 1 二维指针(指向指针的指针) 2 二维数组 3 二维数组的类型 3.2 如何动态申请二维数组 4 总结 1 二维指针(指向指针的指针) 指针的本质是变量 指针的指针是保存指针变量的地址.如 ...

  8. [黑马IOS自学第五篇]C语言二维数组,排序法学习

    一.补充关键字char,short关键字 /* 1.改变整型变量占用的存储空间 int short long long long 改变一个数的符号 signed unsigned */ <spa ...

  9. 二维数组初始化_0基础学习C语言第七章:数组(2)

    C语言 多维数组 C 语言支持多维数组.多维数组声明的一般形式如下: type name[size1][size2]...[sizeN]; 例如,下面的声明创建了一个三维 5 . 10 . 4 整型数 ...

  10. C语言 二维数组遍历 - C语言零基础入门教程

    目录 一.计算一维数组长度 二.计算二维数组长度 1.二维数组行数 2.二维数组列数 3.二维数组的元素个数 = 二维数组行数 * 二维数组列数 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C ...

最新文章

  1. oracle表空间更改用户,ORACLE创建表空间、创建用户、更改用户默认表空间以及授权、查看权限...
  2. java-线程池序号一直增长
  3. JVM_06 垃圾回收相关算法 [ 一 ]
  4. 给我一个兴趣点,我就能撬动一个行业
  5. Docker热点文章链接 - 持续更新
  6. webrtc 源码结构
  7. electron 打包后 __static_electron开发客户端注意事项(兼开源个人知识管理工具“想学吗”)...
  8. Python求1~300之间所有的完数
  9. 人工智能十大算法_套磁amp;科研 |南加利福尼亚大学空间科学研究所终身教授YaoYi Chiang带来数据挖掘算法研究课题...
  10. java项目 字典实现,java项目中数据字典的实现
  11. 造车新势力回港:蔚来能重拾“老大哥”头衔吗?
  12. 暮拾晨花,回望流年——我的2016
  13. vue 动态修改页面的meta
  14. 正则html在线测试,正则表达式在线测试工具
  15. DirectShow 下载
  16. ❤️连续面试失败后,我总结了57道面试真题❤️,如果时光可以倒流...(附答案,建议收藏)
  17. blender新手入门教程中文 编辑后属性选项显示
  18. Linux配置中文支持
  19. windows中oracle自动备份
  20. 一个访问不了造成的祸害

热门文章

  1. LeetCode——5731. 座位预约管理系统(Seat Reservation Manager)[中等]——分析及代码(Java)
  2. PMP笔记 第6章 项目进度管理
  3. 无线电通信之父:马可尼
  4. 阿里云网站域名备案流程全过程(图文讲解)
  5. Python电影数据分析案例
  6. 如何解读Linux Kernel OOPS信息
  7. HADOOP的搭建和配置(一)基础环境配置
  8. python水印_使用Python PIL 给图片添加水印
  9. 扎克伯格是如何让员工学会高效工作的?
  10. 关于笔记本WLAN无线上网