转自:http://blog.163.com/tianhit@yeah/blog/static/165747821201052195212719/

#include<iostream>
using namespace std;

int   fun(int a[][3],int n)     // 其中二维数组形参必须确定数组的第二维的长度,第一维长度可以不定
//int fun(int (*a)[3],int n)   //  和  int   fun(int a[][3],int n)  功能和用法完全相同
{
    int sum=0;
    for (int i=0;i<n;i++)
    {
         for(int j=0;j<3;j++)
         sum=sum+a[i][j];
    }
    return sum;
}

void fun1(int a[2])
{
    int n = sizeof(a); // 因为在实际函数调用时,传递来的实参都是指针,所有这里是对指针求sizeof,
                       // 而指针变量是int的整型变量。在vc++ 6.0中int类型变量占4字节,所以 n肯定是4
    printf("%d/n",n);
}

int fun2(int a[],int n)   //形参中可以不指定一维数组的大小。
{
    int sum=0;
    for(int i=0;i<n;i++)
         sum=sum+a[i];
    return sum;
}

int main()
{
    int b[2][3] = {{1,2,3},{4,5,6}};
    int a[3]={1,2,3};
    int num=0;
    int num2=0;
    int i=2;
    int *p=&i;
        num=fun(&b[0],2);    //ok
    //  num =fun(b,2);  //ok

//  num=fun(&b[0][0],2);  // error C2664: 'fun' : cannot convert parameter 1 from 'int *' to 'int [][3]'
    //  num=fun(&b,2);        // error C2664: 'fun' : cannot convert parameter 1 from 'int (*)[2][3]' to 'int [][3]'
    //  num=fun(b[0],2);      // error C2664: 'fun' : cannot convert parameter 1 from 'int [3]' to 'int [][3]'
   
        num2=fun2(&a[0],3); // ok
    //    num2=fun2(a,3);  //ok

//  printf("%d/n",num2);

//  printf("%d %d %d %d %d %d/n",b[0],&b[0],b[0][0],&b[0][0],b,&b); //只有b[0][0]是数组元素,其他均为地址
    //  结果: 1245032 1245032 1 1245032 1245032 1245032

//  结论:虽然 b[0],&b[0],&b[0][0],b,&b 的值都相同,但是它们所代表(指向)的类型可能就不一样,其中&b[0]和b所指
    //  向的类型是相同的,b[0]和&b[0][0]的类型可以是认为是相当(注意是相当,不是相同)。
   //  C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针,
  //  当N维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素(这里的首元素是个N-1维数组)首地址的指针,

//  printf( "%d/n ",num);
    //    printf("%d %d %d/n",sizeof(*p),sizeof(p),sizeof(b));  // sizeof(b)是求数组里所有元素所占的内存总和

//  printf("%d %d %d %d/n",*p,p,sizeof(&b[0]),sizeof(b[0]));
          // sizeof(&b[0])是对指针,即数组b的第一个元素(当然它是个长度是3的一维数组)的地址作用
          // sizeof(b[0])是对数组b的第一个元素(当然它是个长度是3的一维数组)的作用,相当于求长度是3的一维数组所有
         // 元素所占内存和
    //  结果:2 1245008 4 12 //其中1245008是p的值,即*p的地址

//    fun1(a); //ok
    //    fun1(&a[0]);//ok
    //    fun1(&a);// error C2664: 'fun1' : cannot convert parameter 1 from 'int (*)[3]' to 'int []'
        
    //    printf("%d/n",sizeof(a));
        return   0;
}

//*****************************************************************************
//二维数组的引用作形参时,注意事项。看例子
#include<iostream>
using namespace std;

int   fun(int (&a)[2][3])         //ok,引用作形参,数组作引用形参,必须指定清楚所有维数
// int  fun(int (&a)[ ][3],int n)     //error C2265: '<Unknown>' : reference to a zero-sized array is illegal
// int  fun(int &a[2][3])             // error C2234: '<Unknown>' : arrays of references are illegal
{
    int sum=0;
    for (int i=0;i<2;i++)
    {
         for(int j=0;j<3;j++)
         sum=sum+a[i][j];
    }
    return sum;
}

int main()
{
    int b[2][3] = {{1,2,3},{4,5,6}};
    int num=0;
    num=fun(b);
    printf("%d/n",num);
    return 0;
}

C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结相关推荐

  1. C/C++中二维数组作为函数参数------方法及要点讲解

    ** 1,形参给出第二维的长度. ** C/C++中二维数组作为函数参数 的时候,可以不写行号,但是一定要写明列号(一定注意,一定注意,一定注意!). int array[3][3]; 函数声明:vo ...

  2. c语言动态的申请矩阵存储空间,C语言中二维数组如何申请动态分配内存

    C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include #include int main() { int **a; int i ...

  3. php二维数组取交集,PHP中二维数组怎么取交集

    PHP中二维数组取交集的方法:首先循环其中一个数组:然后使用in_array()函数判断被循环数组的每个元素是否在另外一个数组中:最后输出$out_arr即可. PHP二维数组怎么取交集? 思路,循环 ...

  4. Java中二维数组的用法(不定长二维数组)

    Java中二维数组的用法(不定长二维数组),即每个第二维的数组长度不一样. 1>代码如下: package com.demo.test;public class Test {public Tes ...

  5. java中二维数组的长度

    java中二维数组的长度 public class Solution {public boolean Find(int target, int [][] array) {for(int i=0;i&l ...

  6. C#中二维数组的二维长度

    C#中二维数组的二维长度 二维数组的长度 int row = Arr.GetLength(0); //第一维的长度(即行数)int col = Arr.GetLength(1); //第二维的长度(即 ...

  7. Java中二维数组的动态初始化

    java中二维数组的动态初始化: 使用new关键字实例化,并且指定一个维度. 什么是一个维度,显式维度,或者隐式维度. 而不是直接等于{{"hello", "world& ...

  8. python二维数组表示_python中二维数组中的数如何表达

    python二维数组如何挑选出一定范围的数值? 比如说有一个二维数组 13.1 13.2 13.3 13.4 15.5 15.0 45.2 22.3 22.3 3 [j for i in a for ...

  9. C语言中二维数组靶点的查找(一行内最大,一列内最小)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 关于C语言中二维数组查找靶点的问题 一.靶点是什么? 二.算法设计 1.思考如何找到该二维数组的靶点 2.读入数据 前 ...

最新文章

  1. 使用×××版软件中常见的一些错误代码
  2. Web Office 常见问题解决方法
  3. Paint.Net学习笔记——二、窗体(上)
  4. C# 2.0 除了泛型
  5. 深入SQL SERVER 2000的内存管理机制
  6. 自己Ubuntu里面的一些小脚本
  7. (计算机组成原理)第七章输入和输出系统-第四节3:I/O方式之DMA方式
  8. awk调用shell命令的两种方法:system与print
  9. pytorch torch.stack
  10. 宝塔面板部署python项目
  11. 挨踢攻城师必备的路由交换技术
  12. 并查集详解(C/C++)
  13. 什么是根证书?为什么用户必须下载根证书?
  14. 【面试笔试-c/c++】人民搜索2012校园招聘试题
  15. Commit cannot be completed since the group has already rebalanced and assign
  16. 交通运输学计算机吗,交通运输专业所属学科门类是什么
  17. HDOJ 1164 Eddy's research I(拆分成素数因子)
  18. 销售订单(Sales Order)流程
  19. 从零开始开发微信小程序(四):微信小程序绑定系统账号并授权登录之后台端...
  20. 【笔记】excel预加载word引用

热门文章

  1. Opencv2.4.4示例程序说明
  2. LeetCode刷题记录3——237. Delete Node in a Linked List(easy)
  3. nio的优势_NIO研究所 | 最有AI的EC6故事
  4. python 函数递归一次增加一次变量_python3--函数(函数,全局变量和局部变量,递归函数)...
  5. 相机标定 matlab opencv ROS三种方法标定步骤(1)
  6. python threading模块多线程源码示例(二)
  7. 三维地形制作软件 World Machine 基础入门学习教程
  8. 装饰模式(Decorator)
  9. sql数据库系统表和mysql系统表
  10. MySQL闪退问题的解决