C 语言允许使用多维数组,即使用多组小标的数组,二维数组是最常用的多维数组。多维数组在内存中存放数据的顺序与一维数组相同,使用连续的存储单元。

4.2.1 二维数组的一般形式

二维数组的一般声明形式为:

数组类型 数组名[长度1][长度2];

数组的总长度等于 长度1 与 长度2 的乘积。如下列所示:

char c[2][5] = { 63, 64, 65, 66 ,67 ,68, 69, 70, 71, 72 }; // 声明二维数组并初始化,数组总长度为 10

该语句声明了一个拥有 10 个存储单元的字符型数组,在内存中的位置如下图所示。在实际应用中,可将二维数组理解为一个表格,第一组小标为表格的行数,第二组小标为表格的列数。每组下标以 0 开始,最后一个元素的下标数值为长度减1。

注意:引用数组边界之外的元素将造成程序运行错误。数组初始值列表中提供的初始值多于数组元素数量,使用变量作为数组长度声明数组将引起编译错误。

4.2.2 二维字符串数组

二维字符串数组可以看作是多个一维字符串数组,第一组下标长度即存放的字符串个数,第二组下标长度是可存放的最长的字符串长度加 1。当使用标准函数库的字符串函数处理二维字符串数组时,必须给出第一组下标,每次只能处理其中一个字符串。如下例所示:

char buddy[3][200];
int i;
printf("请输入联系人姓名:");
scanf("%50s", buddy[0]); // 从键盘输入获取长度为 50 的字符串,并保存到数组第 1 行 printf("\n请输入联系人电话:"); // 从键盘输入获取长度为 30 的字符串,并保存到数组第 2 行
scanf("%30s," buddy[1]); prinft("\n请输入联系人地址:");
scanf("%199s", buddy[2]); // 从键盘输入获取长度为 199 的字符串,并保存到数组第 3 行 printf("\n您输入的信息是:\n");
for (i = 0; i < 3; i++)
{
printf("%s", buddy[i]); // 依次输出数组的每一行
}

示例中声明了一个长度为 600 的二维字符串数组,该数组最后一组下标的长度为 200,所以能存放的字符串长度最长为 199。使用scanf() 和 printf() 函数处理字符串数组时,要省略掉最后一组下标,这样能得到所要处理的字符串的首地址,字符串处理函数会在遇到字符串结束符是停止处理,忽略字符串结束符后的存储单元。scanf()函数会为输入的字符串加上字符串结束符。当输入的字符串长度超过格式控制符所指定的长度时,scanf()函数将自动根据指定长度裁剪。但如果格式控制符没有指定长度,则会窜入下一行,造成逻辑错误。

【C语言入门教程】4.2 二维数组的更多相关文章

  1. 论C语言中二级指针和二维数组之间的区别

    刚开始学习C语言的时候,觉得一个数组可以定义一个一级指针去访问,想当然的就觉得可以定义一个二级指针去访问二维数组.很显然这是错误的. 我们来看看C语言的数组在内存中的存储方式. 实际上C语言中的数组, ...

  2. 《java入门第一季》二维数组三个案例详解

    案例一:遍历二维数组 /* 需求:二维数组遍历 外循环控制的是二维数组的长度,其实就是一维数组的个数行数. 内循环控制的是一维数组的长度,每一行,一维数组元素分别的个数. */ class Array ...

  3. C语言批量数据到动态二维数组

    上一篇文章将文件读取放到静态创建的二维数组中,可是结合网络上感觉到今天的DT时代,这样批量大量读取一个上百行的数据,分配的内存是否可能由于大量的数据而产生溢出呢,近期一直研究里malloc函数.通过它 ...

  4. 【C语言入门教程】4.1 一维数组

    数组与指针涉及到数据在内存中的存储位置问题,数组由连续的存储单元组成,最低地址对应于数组的第一个单元,最高地址对应于数组的最后一个单元.指针是一种特殊的变量,该变量所存放的是内存地址,通过指针变量可访 ...

  5. 【C语言入门教程】4.8 指针数组

    指针数组是一种特殊的数组,这类数组存放的全部是同一数据类型的内存地址.指针数组的定义形式为: 数据类型 *数组名[长度]; 例如: const char *c[4] = { "China&q ...

  6. C语言复习---找出一个二维数组的鞍点

    前提: 求任意的一个m×n矩阵的鞍点——鞍点是指该位置上的元素在该行上为最大.在该列上为最小, 矩阵中可能没有鞍点,但最多只有一个鞍点. m.n(<=m<=.<=n<=)及矩阵 ...

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

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

  8. c语言编程学习之二维数组

    二维数组 c语言按照行主序存储二维数组.也就是说,二维数组元素在内存中的位置是连续的,每行末尾元素(若不是最后一行)的下一个元素就是下一行的首元素. 如下图所示 接下来我们来分析一下如何将二维数组所有 ...

  9. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

随机推荐

  1. 解决“HTTP/1.1 405 Method not allowed”问题

    Apache.IIS.Nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回"HTTP/1.1 405 Method not allowed"错误. 即,将 ...

  2. python使用cookielib库示例分享

    Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持,下面是使用示例 该模块主要功能是提供可存储cookie的对象.使用此模块捕获 ...

  3. 屠蛟之路_重伤的屠蛟俊_ThirdDay

    在屠蛟少年们重登数据库大山的途中,少年屠蛟俊(511)实力扛把子,一直坚持在队伍前头开路引领.披荆斩棘,却也因为一路与险水恶林.狂禽猛兽做战斗而精力受损,最终一不小心坠进beta怪蛟设置的陷阱深洞里, ...

  4. javascript 代码可读性

    可读性的大部分内容都是和代码缩进相关的,必须保证代码有良好的格式.可读性的另一方面就是注释,一般而言,有如下一些地方需要进行注释 1.1.1 函数和方法 每个函数或方法都应该包含一个注释,描述其目的和 ...

  5. eclipse配置gradle

    1.Grandle官网下载Gradle 2.解压文件,配置到环境变量 3.测试安装成功,$ gradle -v 4.打开eclipse,Help-->Install new software,输 ...

  6. 关于input/textarea提交内容空格回车转换问题,以及ng-model去除空格问题

    input/textarea提交内容空格回车转换问题 /*my-enter-bind.js*/ /*回车换行显示转义*/ 'use strict'; angular.module('app') .di ...

  7. 淘淘商城maven工程的创建和svn的上传实现

    后台管理系统工程结构 maven管理的好处 1.项目构建.Maven定义了软件开发的整套流程体系,并进行了封装,开发人员只需要指定项目的构建流程,无需针对每个流程编写自己的构建脚本. 2.依赖管理.除 ...

  8. JavaScript的闭包原理

    什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 个人的理解是 ...

  9. Linux下Memcache 安装和使用

    Memcached是一种高性能的分布式内存对象缓存系统(memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能,其“分布式”由客户端函数库完成,成熟算法的为一致性Hash),用 ...

  10. centos7.2安装paramiko报error: command 'gcc' failed with exit status 1的解决办法

    安装依赖 yum install kernel-devel libxslt-devel libffi-devel python-devel mysql-devel zlib-devel openssl ...