二维数组有两种形式:
①在栈上:
        int a[4][4] = {...};
②在堆堆上:
         int ** a = new int *[4]; 
         for(int i = 0; i < 4; i++)
                  a[i] = new int[4];
 
这两种情况下,二维数组做形参的传参方式是不一样的。
 
①在栈上时
void fun(int * a, int rownum, int colmunnum)   //形参传递按照一维指针
{
    ...
    a[r * colmunnum + c] = ...;     //根据行列计算找到对应位置
}
 
void main()
{
    int a[4][4] = {...};
    fun((int *)a, 4, 4);  //调用时强制转换为一维指针
}
 
 
 
②在堆上时
void fun(int ** a, int rownum, int colmunnum)   //形参传递按照二维指针
{
    ...
    a[r][c] = ...;     //直接读取对应位置
}
 
void main()
{
    int ** a = new int *[4]; 
         for(int i = 0; i < 4; i++)
                  a[i] = new int[4];
 
    fun(a, 4, 4);  //直接调用
}
 
 
 
这两种方式,相互不能串用,会出错。具体原因是因为:
①栈上分配的二维数组,实际类似于一个一维数组,所有的值都连续存储。即使int a[4][4]这样写,a也是一个int (*)[4]型的指针,不是int **,即内容连续存储每4个换一行;
②而堆上分配的 int ** a = new int *[4], 其四个子指针有是分别分配的,内容不连续。故不可以通过r*colnum +c来定位。
 
如果堆上的二维数组用第一种方式传参,输出会是乱码,因为读取了错误的地址。
而栈上的二维数组用第二种方式传参会报错,读取了没有分配的内存空间。
 
 
 
自己总结的:http://www.cnblogs.com/dplearning/p/4631541.html

【C语言】二维数组做形参的更多相关文章

  1. C语言二维数组作为函数的参数

    前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include < ...

  2. c语言二维数组传递

    c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维 ...

  3. [语法]C语言中二维数组做输入参数

    C语言中二维数组做输入参数时, 可以同时指定各维长度, 可以只指定第二维的长度, 不可以只指定第一维的长度, 不可以各维长度都不指定. 一句话总结:要指定至少指定第二维,都不指定是不行的. 具体栗子如 ...

  4. 【C语言】二维指针做形参

    转自:http://hi.baidu.com/gpmzccqceabimqq/item/f499f057aa1520404eff208b 关键: 传入时强制类型转换 + 使用时自己手工寻址 今天写程序 ...

  5. 关于c语言二维数组与指针的个人理解及处理办法。

    相信大家在学习C语言时,对一维数组和指针的理解应该是自信的,但是,我在学习过程中,看到网上一些博文,发现即便是参加工作的一些专业编程人员,突然碰到二维数组和指针的问题时,也可能会遇到难以处理的诡异问题 ...

  6. C语言 二维数组复制、清零及打印显示

    #include <stdlib.h> #include <stdio.h> #include <string.h> //二维整型数组打印显示 ],int row, ...

  7. C语言二维数组作业

    一.PTA实验作业 题目1:7-3 出生年 1. 本题PTA提交列表 2. 设计思路 1.声明一个函数different()用来计算一个年份的不同数字个数 2.定义y(y是来计算符合要求的年份的量), ...

  8. C语言二维数组作为函数参数

    设有整型二维数组a[3][4]如下:0   1   2   34   5   6   78   9  10  11 它的定义为:    int a[3][4]={{0,1,2,3},{4,5,6,7} ...

  9. C语言 二维数组(指针)动态分配和释放(转)

    C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...

随机推荐

  1. INFORMIX数据库常用命令

    INFORMIX数据库常用命令 一.onstat命令集 1.onstat  - 说明:查看数据库当前的状态 用法:onstat  - 2.onstat  -c 说明:查看数据库的配置文件 用法:ons ...

  2. Apache+tomcat集群配置

    一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...

  3. hdu 5327 Olympiad

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5327 Olympiad Description You are one of the competit ...

  4. hdu 1908 Double Queue

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1908 Double Queue Description The new founded Balkan ...

  5. Windows Phone自定义控件 ProgressRing

    前言 Windows Phone为开发者提供了很多原生控件,但在很多场景下我们需要对默认的功能或样式做一定的修改才能满足我们的需求,自定义控件应运而生.本文通过以自定义控件进度环(ProgressRi ...

  6. django-south

    python manage.py schemamigration youappname --initial # --initial在数据库创建models定义的表,以及South需要的south_mi ...

  7. [转]Gridview中实现RadioButton单选效果

    HTML <asp:TemplateField ItemStyle-Width="22px"> <ItemTemplate> <asp:RadioBu ...

  8. dev 激活没有权限问题

    用管理员身份打开 Microsoft Visual Studio 2010-->Visual Studio Tools-->Visual Studio 命令提示(2010) 然后输入一下命 ...

  9. P3383: [Usaco2004 Open]Cave Cows 4 洞穴里的牛之四

    这个系列总算是做完了,这是我第一次高效率做完四道题,虽然中间有两道水题,但是第一和第四题还是蛮好的,但是只要能想到思路就很快能打完的. 像这道题,刚开始在想能不能用DP?但是苦于不知道怎么实施,后来又 ...

  10. 使用C语言在Win控制台中输出带颜色的文字

    学了这么久的C语言,一直停留在编写“控制台”程序的水平.黑色窗口,白色的文字,看多了着实让人感到枯燥无味.但是作为业余爱好者,我既没有那么多时间和精力去学习如何编写窗口程序,也没有那个必要一定用C去调 ...