首页 > 其他分享 >C语言学习心得-二维数组

C语言学习心得-二维数组

时间:2024-08-12 19:52:37浏览次数:13  
标签:初始化 arr 一维 int 学习心得 C语言 二维 数组

(一)二维数组的定义和初始化

定义二维数组arr[3][5]:

int arr[3][5] = { {1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7} };

仔细看这个数组

arr[0] 是第一个一维数组,包含元素 arr[0][0], arr[0][1], arr[0][2], arr[0][3], arr[0][4]

arr[1] 是第二个一维数组,包含元素 arr[1][0], arr[1][1], arr[1][2], arr[1][3], arr[1][4]

arr[2] 是第三个一维数组,包含元素 arr[2][0], arr[2][1], arr[2][2], arr[2][3], arr[2][4]

实际上意味着这个二维数组包含3个一维数组,每个一维数组都包含5个int类型的元素。

所以这个arr[3][5]其实是由3个包含5个元素的一维数组组成的

// 二维数组的初始化
int main()
{
	int arr[3][5] = { 1,2,3,4,5,6,7,8 }; // 不完全初始化
	// 1 2 3 4 5 
	// 6 7 8 0 0 
	// 0 0 0 0 0
    // 从此例可以看出在二维数组初始化与一维数组初始化一样,当程序员没有给数组赋值时,会将空余元素自动补0
    // 编译器会自动将{}内的元素自动按照制定的行列进行初始化,就算写成一维数组的方式,也是一样的

	int arr1[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };// 完全初始化
	// 1,2,3,4,5
	// 2,3,4,5,6
	// 3,4,5,6,7

	// 按照行初始化 
	int arr2[3][5] = { {1,2},{3,4},{5,6} };
	// 1 2 0 0 0 
	// 3 4 0 0 0
	// 5 6 0 0 0
    // 使用花括号对二维数组初始化,每行写在一个花括号里面,每行内的数据如果不完全,则自动补0

	// 二维数组初始化可以省略行,不能省略列
	// int arr3[3][] = {0};
	int arr3[][5] = { 1,2,3,4,5,6,7,8 };// 2行5列
	// 1 2 3 4 5 
	// 6 7 8 0 0
    // 为什么不能省略列呢?
    /*
        因为如果只有行的话arr[3][] = {1,2,3,4,5,6,7,8};
        编译器首先会定义第一行,1 2 3 4 ... 无法知道这一行有多少个元素,即不知道什么时候结束
        结果是编译器报错,程序无法执行

        同样,如果知道列数,不知道行数的话:
        arr[][5] = {1,2,3,4,5,6,7,8};
        编译器首先会定义第一行   1 2 3 4 5 
                 再定义第二行  6 7 8 0 0
        然后结束,将数组定义为2行5列的数组

        两种写法的区别是编译器是否可以通过计算知道:8个整数可以完整地填充两个内层数组
    */

	int arr4[][5] = { {1,2},{3,4},{5,6,7,8} };// 3行5列
	// 1 2 0 0 0
	// 3 4 0 0 0
	// 5 6 7 8 0


	double score[5][30] = { 0 };


	return 0;
}

(二)二维数组的遍历与使用

// 二维数组的使用
int main()
{
	int arr[3][5] = { 0 };
	// 输入值
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
			scanf("%d", &arr[i][j]); // 数组名是地址,数组的元素是元素
	}

	// 输出值
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
			printf("%d ", arr[i][j]);
		printf("\n");
	}
}

程序详解:

1、定义一个二维3行5列的二维数组,将其数组元素全部置为0

2、使用2个for循环遍历二维数组,接收数组的输入值

就像一个n的元素的一维数组一样,数组下标从0开始,到下表n-1结束,即元素个数-1。

所以数组arr的索引范围在[0][0][2][4]之间(基于0的索引)。

(三)二维数组在内存中的存放


// 二维数组在内存中的存储
int main()
{
	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
			printf("&arr[%d][%d] = %p\n",i,j,&arr[i][j]);
	}
	/*
	&arr[0][0] = 02EFF6F8
	&arr[0][1] = 02EFF6FC
	&arr[0][2] = 02EFF700
	&arr[0][3] = 02EFF704
	&arr[0][4] = 02EFF708
	arr[0] [j] 所以二维数组第一个数组名是 arr[0]
	// 每个元素之间差4个字节,跨行的也差4个字节
	&arr[1][0] = 02EFF70C
	&arr[1][1] = 02EFF710
	&arr[1][2] = 02EFF714
	&arr[1][3] = 02EFF718
	&arr[1][4] = 02EFF71C
	arr[1] [j] 所以二维数组第二个数组名是 arr[1]
	&arr[2][0] = 02EFF720
	&arr[2][1] = 02EFF724
	&arr[2][2] = 02EFF728
	&arr[2][3] = 02EFF72C
	&arr[2][4] = 02EFF730
	arr[2] [j] 所以二维数组第三个数组名是 arr[2]
	可以看出二维数组和一维数组一样在内存中也是连续存放的
	*/

	// 将二维数组按照列打印
	// arr[3][5] = {  1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
	// 1,2,3,4,5
	// 2,3,4,5,6
	// 3,4,5,6,7
	for (i = 0; i < 5; i++)
	{
		int j = 0;
		for (j = 0; j < 3; j++)
			printf(" % d ", arr[j][i]);
		printf("\n");
	}
	return 0;
}

从上面的程序可以看出,与一维数组一样,二维数组在内存中也是连续存放的

即从arr[3][5]中第一个一维数组arr[0]依次高地址递增。

标签:初始化,arr,一维,int,学习心得,C语言,二维,数组
From: https://blog.csdn.net/benjiangliu/article/details/141139814

相关文章

  • 二维前缀和学习指南
    为什么我为OI泪目,因为我菜得离谱......二维前缀和引子二维前缀和,仅仅是由一维前缀和进阶了一维而已。为了方便后面的学习,我先给出二维前缀和重点代码。处理二维前缀和for(inti=1;i<=n;i++) for(intj=1;j<=m;j++) sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[......
  • C语言问答进阶--4、基本运算符
    赋值运算符A:下面将介绍赋值操作符。它的符号就是 = .A:赋值操作符,就是把一个值赋值给左边的变量。正如以前说的形如a=1之类的表达就是赋值运算符的具体应用。也许有的人在编写代码的时候写过这种代码:#include "iostream.h"int main(){    int x;    1=x;......
  • C语言——文件操作
     数据持久化的方法:1.把数据存放到磁盘文件(使用文件可以将数据直接存放在电脑的硬盘上,做到数据的持久化)2.存放到数据库 什么是文件呢?磁盘上的文件就是文件。在程序设计中,一般谈及的文件有两种,从文件功能的角度来分类,有:1.程序文件:如 源程序文件(.h)   目标文件(wi......
  • C语言典型例题36
    《C程序设计教程(第四版)——谭浩强》例题3.4输入一个字符,判别它是否为大写字母,如果是,将它转换为小写字母:如果不是,不转换。然后输出最后要输出的字符。代码://《C程序设计教程(第四版)——谭浩强》//例题3.4输入一个字符,判别它是否为大写字母,如果是,将它转换为小写字母:如果不......
  • 练习讲解--手动为二维数组的每个元素赋值
    importjava.util.*;publicclassA{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);int[][]nums=newint[3][4];for(inti=0;i<nums.length;i++){for(intj=0;j<nums[i].lengt......
  • C语言存在的问题——缓冲区溢出
    缓冲区溢出(BufferOverflow)是一种常见的安全漏洞,发生在当程序尝试向一个固定长度的缓冲区写入过多数据时。这可能会导致超出缓冲区分配的内存范围,覆盖相邻内存区域的数据,从而可能引起程序崩溃或安全漏洞。举个例子: #include<cstring>#include<iostream>voidvulnerableF......
  • 第七章 二维数组
    文章目录第七章二维数组1.冒泡排序2.使用Arrays为数组排序3.二维数组第七章二维数组1.冒泡排序每次比较相邻两数小的交换到前面每轮结束后最大的数交换到最后5个数字如何存放数组,数组.length=5控制比较多少轮外层循环,循环变量i控制每轮比较多少次内......
  • 使用C语言构建Lua库
    Lua本身是用C语言编写的,因此使用C编写扩展可以更好地与Lua引擎集成,减少性能瓶颈,同时C语言提供了对底层硬件和操作系统功能的直接访问能力,让Lua可以通过C扩展来实现对文件系统、网络等高级功能的支持。因为C语言非常适合模块化编程,可以很容易地将复杂的Lua功能拆......
  • C语言编译和链接超详解
    文章目录1.翻译环境和运行环境2.翻译环境2.1预处理(预编译)2.2编译2.2.1词法分析2.2.2语法分析2.2.3语义分析2.3汇编2.4链接3.运行环境1.翻译环境和运行环境在ANSIC的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代......
  • 【408DS算法题】009进阶-二维数组的查找
    Index题目实现代码分析题目在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。​进阶要求——时间复杂度:......