从头学习C语言之二维数组

目录
  • 二维数组:
    • 语法:
    • 二维数组存放方式:
    • 二维数组的访问:
    • 二维数组的初始化
    • 示例:
  • 总结

二维数组:

引入一个想法:
一个变量:相当于一个点。
一维数组(也就是数组):点汇聚成为一条直线。
二维数组:直线汇聚成一个平面。
三维数组:平面汇聚成立体图形。

语法:

类型 数组名[常量表达式][常量表达式]

  • int a[6][6];//6*6,6行6列
  • char b[4][5];//4*5,4行5列
  • double c[6][3];//6*3,6行3列

二维数组存放方式:

二维数组的访问:

  • 数组名[下标][下标]
  • a[0][0];//访问a数组中第一行第一列的元素
  • b[1][3];//访问b数组中第二行第四列的元素
  • c[3][3];访问c数组中第四行第四列的元素
  • 同样要注意下标的取值范围,以防止数组的越界访问。
  • —比如int a[3][4],其“行下标”的取值范围是0 ~ 2,“列下标”的取值范围是 0 ~ 3,超出任何一个下标的访问都是越界访问。(非常容易中招

二维数组的初始化

  • 二维数组在内存中是线性存放的,因此可以将所有的数据写在一个花括号内:
  • int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
  • 为了更直观的表示元素的分布,可以用大括号将每一行的元素括起来:
  • int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
  • 或者
  • int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
  • 二维数组也可以仅对部分元素赋初值:
  • int a[3][4]={{1},{5},{9}};
  • 如果希望整个二维数组初始化为0,呢么直接在大括号里写一个0即可:
  • int a[3][4]={0};
  • C99同样增加了一种新特性:指定初始化的元素。这样就可以只对数组中的某些指定元素进行初始哈赋值,而未被赋值的元素自动初始化为0:
  • int a[3][4]={[0][0]=1,[1][1]=2,[2][2]=3};
  • 二维数组的初始化也能偷懒,让编译器根据元素的数量计算数组的长度。但只有第1维的元素个数可以不写,其他维度必须加上:
  • int a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

示例:

例一:二维数组的舒服写法:

  1 #include<stdio.h>
  2 int main()
  3 {
  4   int a[3][4]={
  5     {1,2,3,4},
  6     {5,6,7,8},
  7     {9,10,11,12}
  8   };
  9   int i,j;
 10   for(i=0;i<3;i++)
 11   {
 12     for(j=0;j<4;j++)
 13     {
 14       printf("%d ",a[i][j]);
 15     }
 16     printf("\n");
 17   }
 18 printf("\n");
 19   return 0;
 20 }

例二:对前三行每一行的第一个元素赋初值,其他没有被赋值的自动补充为0:

  1 #include<stdio.h>
  2 int main()
  3 {
  4   int a[3][4]={{1},{2},{5}};
  5   //把前三行每一行的第一个元素赋初值,其他没有被赋值的自动补充为0。
  6   //如果赋值的数,多于三个,后面的会报错,并且自动不算数。
  7   //如果没有对数组进行赋值,则得出的结果为随机数。
  8   int i,j;
  9   for(i=0;i<3;i++)
 10   {
 11     for(j=0;j<4;j++)
 12     {
 13       printf("%d ",a[i][j]);
 14     }
 15     printf("\n");
 16   }
 17   return 0;
 18 }
  1 #include<stdio.h>
  2 int main()
  3 {
  4   int a[3][4]={{1},{2},{5}};
  5   //把前三行每一行的第一个元素赋初值,其他没有被赋值的自动补充为0。
  6   //如果赋值的数,多于三个,后面的会报错,并且自动不算数。
  7   //如果没有对数组进行赋值,则得出的结果为随机数。
  8   int i,j;
  9   for(i=0;i<3;i++)
 10   {
 11     for(j=0;j<4;j++)
 12     {
 13       printf("%d ",a[i][j]);
 14     }
 15     printf("\n");
 16   }
 17   return 0;
 18 }

例三:指定数组元素,其他元素自动补充为0:

  1 #include<stdio.h>
  2 int main()
  3 {
  4   int a[3][4]={[2][3]=1,[2][1]=8,[1][2]=5};
  5   int i,j;
  6   for(i=0;i<3;i++)
  7   {
  8     for(j=0;j<4;j++)
  9     {
 10       printf("%d ",a[i][j]);
 11     }
 12     printf("\n");
 13   }
 14   return 0;
 15 }

例四:证明只有第一维可以不写数值:

  1 #include<stdio.h>
  2 int main()
  3 {
  4   int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};//只有第一维可以不写
  5   int i,j;
  6   for(i=0;i<3;i++)
  7   {
  8     for(j=0;j<4;j++)
  9     {
 10       printf("%d ",a[i][j]);
 11     }
 12     printf("\n");
 13   }
 14   return 0;
 15 }

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言二维数组的处理实例

    复制代码 代码如下: char finalPathSet[256][256]; char middlePathSet[256][256]; int finalSetSize=0; int middleSetSize=0; int addToPathSet(char path[]){    strcpy(middlePathSet[middleSetSize],path);    middleSetSize++;}int meetPathSet(){    char tempPathSet[256

  • C语言二维数组中的查找的实例

    C语言二维数组中的查找的实例 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 思路描述:一个数字的下方和右方是比它本身大的区域,而左方和上方时比它本身小的区域.选取右上角的数字进行比较,当该数大于指定的数时,舍去该列,当该数小于指定的数时,舍去该行,当相等时,则表示找到 C语言实现: #include<stdio.h> #include<stdlib.h>

  • C语言动态分配二维字符串数组的方法

    目录 动态分配一个二维字符串数组 (1) 分配可能不连续的内存 申请 释放 完整demo: (2) 分配连续的内存 申请 释放 完整demo: (3) 将二维字符串数组看成一维字符串数组 申请 释放 完整demo: 动态分配一个二维字符串数组 (1) 分配可能不连续的内存 申请 char**pps8Output = (char **) malloc(n * sizeof(char *)); 对于pps8Output而言,它获得了一块动态分配的连续内存,这块连续的内存可以放n个char *指针.

  • C语言二维数组几种常用的表示方法

    名称:二维数组的几种表示方法 说明:常用的有以下几种二维数组的表示方法: (1).第一种是普通的二维数组的表示方法. (2).第二种是用一维数组来表示二维数组,从显示的元素地址可以看出,二维数组和一维数组表示的二维数组在内存中的储存方式其实是一样的,不过使用二维数组看起来要简单些,只要不用进行地址转换. (3).第三种表示是用指针数组.本例中的c[i]中的元素其实是地址.这种方法对各个元素大小不一样的情况下比较适用.如:假定有若干个不等长字符串需要我们处理,如果使用a [i ][j]结构,则j必

  • C语言 指针与二维数组详解

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 0   1   2   3 4   5   6   7 8   9  10  11 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放 a[

  • C语言中二维数组作为函数参数来传递的三种方法

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char str[ ][5] ) { int i; for(i = 0; i < n; i++) printf("/nstr[%d] = %s/n", i, str[i]); } void main() { char* p[3]; char str[][5] = {"abc&quo

  • 从头学习C语言之二维数组

    目录 二维数组: 语法: 二维数组存放方式: 二维数组的访问: 二维数组的初始化: 示例: 总结 二维数组: 引入一个想法: 一个变量:相当于一个点. 一维数组(也就是数组):点汇聚成为一条直线. 二维数组:直线汇聚成一个平面. 三维数组:平面汇聚成立体图形. 语法: 类型 数组名[常量表达式][常量表达式] int a[6][6];//6*6,6行6列 char b[4][5];//4*5,4行5列 double c[6][3];//6*3,6行3列 二维数组存放方式: 二维数组的访问: 数组

  • Go语言实现二维数组的2种遍历方式以及案例详解

    二维数组遍历的2种方式: package main import ( "fmt" ) func main() { //定义一个二维数组 var arr = [2][3]int{{1, 4, 3},{7, 5, 6}} //方式1. 用for循环来遍历 for i := 0; i < len(arr); i++ { for j := 0; j < len(arr[i]); j++ { fmt.Printf("%v ",arr[i][j]) } fmt.Pr

  • 从头学习C语言之指针和数组

    目录 指针和数组: 示例: 总结 指针和数组: 数组名其实是数组第一个元素的地址. %p用来打印地址,为十六进制 &:取址操作符 如果用一个指针指向数组,应该怎么做呢? char *p; p=a;//语句1 p=&a[0];//语句2 指针的运算: 当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做的意义相当于只想距离指针所在位置向前或向后第n个元素. 对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法. 需要郑重强调的是:p+1并不是简单的将地址加1,二

  • C语言二维数组应用实现扫雷游戏

    本文实例为大家分享了C语言二维数组应用实现扫雷游戏的具体代码,供大家参考,具体内容如下 游戏简介: 电脑随机设置10个雷,用户输入坐标,若坐标下是雷则结束游戏,不是则该位置显示周围的雷数. game.h #ifndef __GAME_H__  #define __GAME_H__  #include<stdio.h>  //设置屏幕显示的雷盘的大小 #define ROW 9  #define COL 9  //设置实际雷盘的大小(判断雷数是看用户所选的坐标周围八个坐标内是否设雷,但若是用户选

  • C语言二维数组应用之扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 上次用数组完成了一个井字棋,接下来用数组完成一个简易版扫雷. <扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在短的时间内根据格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输. 根据上述定义,我们可知,游戏胜利的要求是:找出所有非雷的格子. 现在我们简单梳理一下完成游戏的思路 一.变量定义 1.首次要定义地图变量,这里注意要定义两个二维数组,一个用来存放地雷的分布情况,另一个存放玩家看见

  • C语言二维数组应用之井字棋游戏

    本文实例为大家分享了C语言实现井字棋游戏的具体代码,供大家参考,具体内容如下 数组是C语言中一种重要的数据类型,接下来我和大家分享用二维数组完成一个井字棋游戏. 井字棋,是一种在3*3格子上进行的连珠游戏,和五子棋类似.游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜. 井字棋的规则想必大家都已非常清楚,下面来简单梳理一下完成这个游戏的主要思路 一.变量的定义 1.首先要定义棋盘变量为一个3*3的二维数组 

  • C语言数组入门之数组的声明与二维数组的模拟

    语言中指针与数组这两个概念之间的联系是密不可分的,以至于如果不能理解一个概念,就无法彻底理解另一个概念. C语言中的数组值得注意的地方有以下两点: C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来.然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组.这样,要"仿真"出一个多维数组就不是一件难事. 对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针.其他有关数组的操作,哪怕它们看上去是以数组下标进行运算的,

  • 举例理解C语言二维数组的指针指向问题

    之前对数组的概念一直没有理解透彻,只觉得数组名就是个常量指针而已,用法和基本的指针差不多.所以当我尝试用二级指针去访问二维数组时,就经常会出错.下面就是刚开始写的一个错误的程序: #include <stdio.h> int main() { int iArray[2][3] = {{1,2,3},{4,5,6}}; int **pArray = NULL; pArray = iArray; printf("array[0][0] = %d\n", pArray[0][0]

随机推荐