二维数组有两种形式:
①在栈上:
        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. python入门总结-函数

    函数形式: def functionname(paramlist): function body 局部变量不改变实参的值,如果需要改变,声明global.比如,global x 可以给函数默认值,注意 ...

  2. 社保系列7《PSAM卡》

    PSAM卡用于商户POS.网点终端.直联终端等端末设备上,负责机具的安全控管.PSAM卡具有一定的通用性.经过个人化处理的PSAM卡能在不同的机具上使用. PSAM卡支持多级发卡的机制,各级发卡方在卡 ...

  3. Tutorial: Facebook analytics using Power BI Desktop

    In this tutorial you learn how to import and visualize data from Facebook. During the tutorial you'l ...

  4. meteor 实现 微信分享

    Template.hello.events({ 'click button': function () { // increment the counter when button is clicke ...

  5. c++性能测试

    程序分析是以某种语言书写的程序为对象,对其内部的运作流程进行分析.程序分析的目的主要有三点:一是通过程序内部各个模块之间的调用关系,整体上把握程序的运行流程,从而更好地理解程序,从中汲取有价值的内容. ...

  6. git用法

    chapter: 8 add 添加文件内容至索引 用法:git add [选项] [--] ... -n, --dry-run 演习 -v, --verbose 冗长输出 -i, --interact ...

  7. django概述

    一.django的特点 1.提供一体化的web解决方案,什么叫一体化:mvc 2.等你玩儿牛逼了可以拔插组件,换成自己顺手或者更牛逼的组件

  8. Android编程: 界面组成、事件监听器

    学习知识:界面组成.事件监听器 ====界面组成==== 1.用户界面的基本组件叫做View,都是继承android.view.View类,Android里面预定义很多基本的界面组件,比如 Butto ...

  9. UISegmentedControl swift

    // // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...

  10. NewRelicAgent(CustomAnalyticEvent.cxx.o), building for iOS simulator, but linking in object file built for OSX, for architecture x8(botched)

    昨天遇到一个问题,在项目swift1.2适配swift2.0的过程中,修改完毕之后,运行报错如下: /Pods/NewRelicAgent/NewRelic_iOS_Agent_5.1.0/NewRe ...