当前位置: 首页 > news >正文

C语言:二维数组

数组

二维数组

定义

二维数组本质上是一个行列式组合,也就是说二维数组是由行和列两部分组成,属于多维数组。二维数组通过解读(先行后列

二维数组可被视为特殊的一维数组,当一个数组中的每个元素是一维数组时,这个数字就是二维数组

语法
数组类型 数组名[行容量][列容量]

行容量:外层数组的数组容量

列容量:内存数组的数组容量

每一列的行数相同,每一行的列数相同。参考二维矩阵

 

说明
  • 二维数组在初始化的时候,可以省略行数,系统会通过初始化后的数据自动推断行数。

  • 二维数组和一位数组一样,也可以部分初始化,未初始化的元素使用0

  • 二维数组在初始化的时候,不能省略列数,否则编译报错。

举例:

int arr[3][3]={{11,12},{21,22,23},{31}};
int arr[][3]={{11,12,13},{21,22,23},{31,32,33}};
int arr[3][3]={0};
int arr[3][3]={11};
int arr[][3]={11,12,13,21};
特殊写法
  • 下标可以是整形表达式。如a[2-1[2*2-1]]正确 →a[1][3]

  • 下标可以是已经有值的变量或数组元素。如a[2*x-1][b[3][1]][]内最终需要一个>0的整数

  • 数组元素可以出现在表达式中。如b[1][2] = a[2][3]/2

  • 演示  :
数组arr列0列1列2举例说明
行0111213arr[0] [1]数组arr的0行1列
行1212223arr[1] [2]数组arr的1行2列

注意:使用数组元素的下标应在已定义数组的大小范围内;应注意区别定义数组大小和引用数组元素的区别  

初始化
  • 分行给二维数组赋初值

  • 可将所有数组写在一个{}内,按排序进行划分、赋值

  • 可对部分元素赋初值,其余元素填充0

  • 若对全部元素赋初值,可省略第一维数组容量第二维数组容量必须指明

  • 在分行赋初始值时,也可省略第一维数组容量

 

案例:
  • 需求:二维数组的遍历

  • 分析:

    • 二维数组本质上是一个行列式,遍历需要用嵌套for循环,外层for行遍历,内层for列遍历

    • 取值

    • 赋值

    • 计算行和列的大小

代码:

#include <stdio.h>int main(int argc,char *argv[])
{//创建一个二维数组int arr[][3]={{11},{21,22},{31,32,33}};//获取行和列的大小int row_len=sizeof(arr)/sizeof(arr[0]);int col_len=sizeof(arr[0])/sizeof(arr[0][0]);//嵌套for进行遍历//外层遍历行for(int i=0;i<row_len;i++) //i <= raw_len-1{//内层遍历列for(int j=0;j<col_len;j++) //j <= col_len-1printf("%-4d",arr[i][j]);}printf("\n");return 0;
}
  • 运行结果

案例:
  • 需求:矩阵转置

  • 分析

    • 列变行,行变列

  • 代码:
#include <stdio.h>#define ROW 2
#define COL 3int main(int argc,char *argv[])
{//定义循环变量int i,j;//准备两个数组,存放转置前后的数组int arr_before[ROW][COL]={{11,12,13},{31,32,33}};int arr_after[COL][ROW]={};//计算数组大小int arr_before_row = sizeof(arr_before) / sizeof(arr_before[0]);int arr_before_col = sizeof(arr_before[0]) / sizeof(arr_before[0][0]);int arr_after_row = sizeof(arr_after) / sizeof(arr_after[0]);int arr_after_col = sizeof(arr_after[0]) / sizeof(arr_after[0][0]);//for循环遍历数组,并转置printf("\n转置前数组:\n");for (i=0;i<arr_before_row;i++){for (j=0;j<arr_before_col;j++){printf("%d  ",arr_before[i][j]);arr_after[j][i] = arr_before[i][j];}printf("\n");}printf("\n");printf("\n转置后数组:\n");for (i=0;i<arr_after_row;i++){for (j=0;j<arr_after_col;j++){printf("%d  ",arr_after[i][j]);}printf("\n");}printf("\n");return 0;
}
练习
  • 需求:求一个3行3列的矩阵对角线上的元素之和。

  • 代码:

#include <stdio.h>int main(int argc,char *argv[])
{//存储累加和int sum = 0;//创建一个3×3的二维数组int arr[][3] = {{1,4,7},{2,5,8},{3,6,9}};//计算数组大小int row_len = sizeof(arr)/sizeof(arr[0]);int col_len = sizeof(arr[0])/sizeof(arr[0][0]);//for循环遍历数组,并计算对角线上元素之和printf("3×3矩阵为:\n");for(int i=0;i<row_len;i++){for(int j=0;j<col_len;j++){printf("%d",arr[i][j]);if(i==j)sum += arr[i][j];}printf("\n");}printf("\n");printf("其对角线之和为:%d\n",sum);return 0;
}
  • 运行结果:

 

字符数组

在C语言中,支持字符串常量,不支持字符串变量。如果想要实现类似的字符串变量,C语言中有两种方式。

  • 字符数组


char name[] = "哪吒";
  • 字符指针

char *name[] = "哪吒";
概念

元素类型为char(字符型)的数组叫做字符数组。字符数组往往是用来存储字符串数据的。需要注意的,我们C语言中的字符是字节字符

举例:
char a = 'A';  //正确
char b = '1';  //正确,ASCII码:49
char c = 1;    //正确,ASCII码:1
char d = '\n'; //正确
char e = "A";   //错误,双引号是字符串
char f = '花';  //错误,中文ASCII码范围不在0~127,
语法

一维数组:

char 数组名[数组容量];

二维数组:

char 数组名[行容量][列容量];

 字符数组的语法就是我们之前所学的一维数组和二维数组的语法,只不过数据类型是char而已。

注意:

如果我们的char数组初始化的时候,没有完全初始化值的时候,使用\0(\0对应的ASCII值是0)进行填充。大家要注意,这里的\0只是起到一个占位或者标识的作用,我们是无法通过printf等打印输出到控制台的(不支持输出)。

案例
  • 需求:输出一个字符序列(I LOVE YOU)

  • 代码:

#include <stdio.h>int main(int argc,char *argv[])
{//创建一个数组,用来存储I LOVE YOU。' '空格也是字符,对应的ASCII为32char arr[]={'I',' ','L','O','V','E',' ','Y','O','U'};//计算数组的大小int len=sizeof(arr)/sizeof(arr[0]);//for循环遍历for(int i=0;i<len;i++) printf("%c",arr[i]);printf("\n");return 0;
}
  • 运行结果

案例

  • 需求:输出一个用*组成的空菱形图案

  • 代码

#include <stdio.h>int main(int argc,char *argv[])
{//创建一个二维数组,存放菱形char arr[5][5]={{' ',' ','*',' ',' '},{' ','*',' ','*',' '},{'*',' ',' ',' ','*'},{' ','*',' ','*',' '},{' ',' ','*',' ',' '}};//计算行和列的大小int row_len=sizeof(arr)/sizeof(arr[0]);int col_len=sizeof(arr[0])/sizeof(arr[0][0]);//遍历数组for(int i=0;i<row_len;i++){for(int j=0;j<col_len;j++)printf("%c",arr[i][j]);printf("\n");}return 0;
}
注意:
  • 如果定义时,不初始化,元素值不确定(局部作用域)

  • 如果提供的字符个数大于数组长度,则按照语法错误处理(会报警告,但能编译通过);如果字符个数小于数组长度,后面的元素自动补 \0

  • 如果提供的字符个数与数组长度相同,可以省略数组长度,系统会自动确定元素的个数,适合字符较多时。

字符串结束标志:

说明

  • C语言规定,字符串常量以字符 \0作为结束标志。

  • 编译系统对字符串常量自动加一个\0作为结束标志。

  • 程序中往往通过\0来检测字符串是否结束。举例:while(arr[i] != '\0'){..}

  • \0的ASCII码时0,不是一个可显示可输出的字符,是“空操作符”。什么都不做,不增加有效字符,仅用于一个工程判别的标志或在数组中占位

字符数组的多样性表示

我们的char数组可以以数组的形式一个一个输出每个字符;也可以以字符串的形式整体输出

 举例:

#include <stdio.h>int main(int argc,char *argv[])
{//字符串的第一种表达:char s1[]={'h','e','l','l','o',' ','w','o','r','l','d','\0'};//字符串的第二种表达:char s2[]={"hello world"};//字符串的第三种表达:char s3[]="hello world";//计算字符串所占字节数printf("s1=%lu,s2=%lu,s3=%lu\n",sizeof(s1),sizeof(s2),sizeof(s3));//计算数组大小int len=sizeof(s3)/sizeof(s3[0]);//遍历输出for(int i=0;i<len;i++){//过滤\0if(s1[i]=='\0' || s2[i]=='\0' || s3[i]==0) continue;printf("%c,%c,%c\n",s1[i],s2[i],s3[i]);}printf("\n");//字符串的第二种输出printf("%s,%s,%s",s1,s2,s3);printf("\n");return 0;
}
注意:
  • 字符串长度与字符数组的长度不一定相同。

    char name[] = "hello";  // 数组长度:6,字符串长度:5
  • 利用字符串常量可以对字符数组进行初始化,但不能用字符串常量对字符数组赋值

http://www.dtcms.com/a/288909.html

相关文章:

  • 【自动驾驶黑科技】基于Frenet坐标系的车道变换轨迹规划系统实现(附完整代码)
  • OneCode+CloudWeGo 深化实践:智能发货单的 LLM 逻辑推理引擎优化
  • 30天打牢数模基础-层次聚类讲解
  • Ubuntu高频实用命令大全
  • [自用】JavaSE--集合框架(二)--Map集合体系
  • nvm、npm、pnpm、cnpm、yarn
  • `MYSQL`、`MYSQL_RES` 和 `MYSQL_FIELD`的含义与使用案例
  • RCE随笔(1)
  • Node.js worker_threads 性能提升
  • VUE2 学习笔记2 数据绑定、数据代理、MVVM
  • 习题4.4 给出4个湖从大到小的顺序
  • 交通出行大前端与 AI 融合:智能导航与出行预测
  • 详解Mysql Order by排序底层原理
  • 黑马教程Webday6
  • 【Docker基础】Docker-compose常用命令实践(二):状态与日志查看
  • kafka生产端和消费端的僵尸实例以及解决办法
  • Vue开发前端报错:‘vue-cli-service‘ 不是内部或外部命令解决方案
  • 【Java学习|黑马笔记|Day18】Stream流|获取、中间方法、终结方法、收集方法
  • 【Linux】2. Linux下的C/C++开发环境
  • 【UE5医学影像可视化】读取dicom数据生成2D纹理并显示
  • pytest-log
  • 嵌入式Linux:获取线程ID
  • 数组算法之【合并两个有序数组】
  • 137. Java 泛型 - 泛型与通配符:子类型化关系
  • 【Linux】权限详解 权限本质、权限属性、su、sudo提权、chmod\chown\chgrp、文件类别
  • RxSwift-事件属性
  • Vuex 核心知识详解:Vue2Vue3 状态管理指南
  • Servlet快速入门
  • Docker在NAS部署MoonTV+OrionTV
  • 44.sentinel授权规则