首先,我们拿二维数组为例。二维数组称为矩阵。二维数组在概念上是二维的,但实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,而数组的行数没有太大关系。因为函数调用时传递的是一个指针,它指向由行向量构成的一维数组。其中每个行向量是具有n(n代表列数)个整型元素的一维数组。

  例如如下二维数组:

static char daytab[][] = {
{, , , , , , , , , , , , },
{, , , , , , , , , , , , }
};

  在把上述daytab数组作为实参传递给函数时,传递给函数的是一个指向2个对象的指针,其中每个对象是由13个整型元素构成的一维数组。因此如果将数组daytab作为参数传递给函数f,那么f的声明应该写成下列形式:

f(int daytab[][]) { ... }
f(int daytab[][]) { ... }
f(int (*daytab)[]) { ... } //这相当于声明了一个数组,该数组有13个元素,每个元素都是一个指向整型对象的指针。

  一般来说,除数组的第一维(下标)可以不指定大小外,其余各维都必须明确指定大小。

  在一维存储器中存放二维数组有两种方式:

  • 一种是按行排列,即放完一行之后顺次再放入第二行。
  • 一种是按列排列,即放完一列之后顺次再放入第二列。

  在C语言中,二维数组是按行排列的。

  参考资料

  [1] http://hi.baidu.com/qfpnptyxswbqtyq/item/03e54cdfb35c444afb57680a

【C语言】为什么指明数组的列数?的更多相关文章

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

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

  2. C#获取数组的行和列数程序代码

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  3. C语言中动态分配数组

    如何动态的定义及使用数组呢?记得一般用数组的时候都是先指定大小的.当时问老师,老师说是不可以的.后来又问了一位教C++的老师,他告诉我在C++里用new可以做到,一直不用C++,所以也不明白.今天在逛 ...

  4. C语言多维数组的地址

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

  5. 【转】C语言中动态分配数组

    原文地址:http://blog.chinaunix.net/uid-11085590-id-2914577.html 如何动态的定义及使用数组呢?记得一般用数组的时候都是先指定大小的.当时问老师,老 ...

  6. C#中如何获取一个二维数组的两维长度,即行数和列数?以及多维数组各个维度的长度?

    如何获取二维数组中的元素个数呢? int[,] array = new int[,] {{1,2,3},{4,5,6},{7,8,9}};//定义一个3行3列的二维数组int row = array. ...

  7. java基础之二维数组不定义列数

    有一种特殊的二维数组,它的行数确定,但是每行的列数不确定.这样的的数组实现方法:先创建制定行数,列数缺省的二维数组,然后对数组的每一行重新初始化.举例如下: package day5; //第二种定义 ...

  8. 基于visual Studio2013解决C语言竞赛题之1037数组求列和

          题目 解决代码及点评 /* 功能:已知有三个数组A,B,C,A为5行5列的二维数组,B.C为只有5个元素的一维数组,键盘输入数据的顺序如下: 23,45,6,1,- ...

  9. C二维字符数组的使用及如何获取二维数组的总行数和总列数!

    #include <stdio.h> #include <stdlib.h> int main(){ char str[][30] = {"zhangsan" ...

随机推荐

  1. Javascript 创建对象的三种方法及比较【转载+整理】

    https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...

  2. centos下mysql自动备份

    #!/bin/bashdb_user="root"db_passwd="123456"db_name="test_db"#进入备份目录将之前 ...

  3. jQuery的md5加密插件及其它js md5加密代码

    /** * jQuery MD5 hash algorithm function * * <code> * Calculate the md5 hash of a String * Str ...

  4. 【转】一些linux基础命令

    学习Linux,其实很多基础命令很重要. 不论多么复杂的shell或者命令组合,都是一个一个的拼接组合命令拼接而成: 大号一个基本功,遇到需要的场景,信手拈来,随意组合拼接,是非常重要的. 恰好看到一 ...

  5. 数据库中truncate与delete的区别与联系

    昨天被问到truncate与delete的区别,truncate没用过,回去百度了一下,才知道还有这个一种语句. truncate table命令将快速删除数据表中的所有记录(保留数据表结构).这种快 ...

  6. Nutch的安装和配置

    Nutch是一个Java实现的网络爬虫.Nutch的安装可以使用二进制包,也可以使用源代码安装.这里介绍用二进制包安装. 1. 下载apache-nutch-1.12-bin.tar.gz,并且解压, ...

  7. Android Things专题 1.前世今生

    文| 谷歌开发人员技术专家, 物联网方向 (IOT GDE) 王玉成(York Wang) 2016 年 12 月,Google 公布了 Developer Preview 版的 Android Th ...

  8. C语言中连接器介绍

    在C语言中.一个重要的思想就是分别编译.即若干个源程序能够在不同的时候单独进行编译.然后在恰当的时候整合到一起.可是连接器通常是与C编译器分离的,连接器怎样做到把若干个C源程序合并成一个总体呢? 典型 ...

  9. 关于Android中50M+的文本入库处理细节

    好久没有写技术文章,明早4点还要爬起来赶飞机,感觉这个坑有必要记录一下,以慰藉一下自己脆弱的灵魂.周一和周二忙了2天的样子才解决这个问题,中间填了不少的坑,反正已经夜深了,慢慢地记录一点. 场景:项目 ...

  10. JVM中java实例对象在内存中的布局

    普通的Java对象实例 和  Java数组实例.Java数组实例的对象头多了一个数组的长度.Java虚拟机可以通过普通java对象的元数据来确定java对象的大小,但是从数组的元数据中却无法确定数组的 ...