一篇文章搞定数组

数组

一,一维数组

数组的概念:数组是一组相同类型元素的集合。 光从概念上看我们可以得到两个有价值的信息1,数组中存放相同类型的数据,这点非常重要。 2,数组是由一个或者多个数据组成的所以在我们给数组定义大小的时候不能为零 即数组的大小不能为零! 另外在c语言中既然有一维数组那肯定就有多维数组,而多维数组尤其以二维数组最为常见,二维数组我们稍后介绍。

1,一维数组的创建

一维数组的创建基本形式如下:

type arr_name[n];
  • type:是数组的数据类型,比如int型,short型,long型,float型等。
  • arr_name:则是数组名,(与变量名不同数组名往往是数组的首地址)
  • [n]:方括号n用来限制数组大小。

所以在创建一维数组时要遵行三个步骤:

一,定义好数组的数据类型,例如上面那些。
二,给数组命名,这个命名与给变量命名是一样的起得有意义就行。
三,给数组设置大小,可以先不给数组设置大小,但不能直接给数组的大小设置零 即arr[0]是非法的 注意不要越界。

2,一维数组的初始化

一维数组的初始化有3种情况一种是完全初始化,一种是不完全初始化,还有一种是错误的初始化(数组越界)下面举几个列子:

//完全初始化
char arr1[3]={'a','b','c'};
//不完全初始化 第一个元素为1第二个元素为2 其余自动补0
int arr2[4]={12};
//数据越界 
int arr3[3]={1,2,3,4};

如果我们不小心越界了就会编译器就会报错列如:
在这里插入图片描述

3,一维数组的类型

很多人觉得数组是没有类型的,但其实数组是有类型的,数组的类型为去掉数组名剩余的就是数组的类型,例如:

char arr1[3];     类型为:char [3]
double arr2[4];   类型为:double [4]
int arr3[3];      类型为:int [3]

注意一维数组的类型仅仅是去掉数组名其他部分是要保留的,例如char arr1[3]是char类型是错的,这个一维数组的类型是char [3]。

4,一维数组的使用

了解完一维数组的创建,初始化,那我们如何来使用一维数组呢?我们要了解如何使用一维数组就要先了解我们的数据在一维数组中是如何存放的。

//例如我们定义一个这样的数组
int arr[10]={1,2,3,4,5,6,7,8,9,10};

在数组中的对应就是这样的:
在这里插入图片描述

  • 注意:数组的下标是从零开始的,下标可以理解为门牌号,只有找到相应的门牌号才能找到相应的房间;同理只有找到相应的下标你才能访问相应的元素。
  • 这时就会有人问了通过什么来引用我们的元素呢?还记得上面提到过的那个方括号吗?没错 [ ]就是c语言给我们提供的一个操作符叫下标引用操作符,通过它我们便可以轻松引用数组的元素。 比如我们想要引用下标为1的元素那么可以这样引用:
#include<stdio.h>
int main()
{
	int arr[10]={1,2,3,4,5,6,7,8,9,10};
	//打印下标为1的元素就可以这样引用
	printf("arr[1]=%d\n",arr[1]); //打印出来结果为2

	//同样我们可以使用下标(索引)来更改我们数组里的内容
	//比如我们让下标为1与下标为5所对应的内容交换一下就可以这样写
	arr[1]=6;
	arr[5]=2;
	//打印交换后的
	printf("arr[1]=%d arr[5]=%d",arr[1],arr[5]);
	return 0;
}

在这里插入图片描述
从交换前与交换后的运行结果上看,我们可以更直观的看出利用下标(索引)对不同下标的元素内同进行了交换。
那就又有人要问了如果我想访问整个数组怎么实现呢?你想想我们既然要通过下标来访问元素那我们不妨用for循环产生数组的所有下标来访问整个数组。

5,一维数组的输入和输出

先来看一段代码:

#include<stdio.h>
int main()
{
	int arr[5]={0};
	int i=0;
	//访问1到4的下标进行认为输入
	for(i=0;i<5;i++)
	{
		scanf("%d",&arr[i]);
	}
	//输入完后 数组里已经存放了数据 紧接着输出
	 for(i=0;i<5;i++)
	 {
	 	printf("arr[%d]=%d ",arr[i]);
	 }
	return 0;
}

在这里插入图片描述
通过上面代码我们首先使用一个for循环产生一次0到4的下标用于输入,也就是输出结果的第一行(1,2,3,4,5)输入时要注意arr是数组的首地址,arr[i]才是数组元素,对数组元素输入我们要取地址& 这一点至关重要!
同样,输出我们也再用一次for循环产生从0到4的下标,然后再打印对应下标的元素。

归根结底们要想访问某个元素就要产生对应的下标,要想访问整个数组就要产生全部下标。即数组元素是通过下标来访问!

我们了解完用for循环产生数组下标后,在遍历数组的时候,我们经常想知道数组的元素个数,那C语⾔中有办法使⽤程序计算数组元素个数 吗?答案是有的,可以使用sizeof来计算数组大小(单位是字节),有了数组大小便可以轻易计算出数组元素,使用数组大小/一个元素所占用的空间,(列如int型占用4个字节)就可以算出元素个数了。

6,sizeof计算数组大小及元素个数

比如:

#include<stdio.h>
int main()
{
	int arr[10] = {0}; 
	printf("%d\n", sizeof(arr));//计算数组的大小,单位是字节
	
	printf("%d\n", sizeof(arr[0]));//计算⼀个元素的⼤⼩,单位是字节 
	//计算数组元素的个数 用数组总大小/一个元素的大小	
	printf("%d\n",sizeof(arr)/sizeof(arr[0]));
	return 0;
	
}

在这里插入图片描述
首先我们来分析一下代码,我们的定义的数组的数据类型为int [10],而一个int类型的数据内存空间占4个字节,有10个元素所以是10*4=40;一个元素的大小就是一个int类型的数据所占的大小为4;元素个数为总大小40/4=10个元素。当然我们也可以用一个宏定义来方便更改数组的长度 只需要再main函数的上面 define s 10就行define 后的名字不唯一。

说完一维数组接下来我们来介绍一下二维数组。

二,二维数组

前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元 素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称 为多维数组。

1,二维数组的创建

与一维数组的形式相似基本形式为:

type arr_name[常量值1][常量值2]; 
例如: 
int arr[3][5]; 
double data[2][8];
  • 3表示数组有3行
  • 5表示每一行有5个元素 (列)
  • int 表示数组的每个元素是整型类型
  • arr 是数组名,可以根据自己的需要指定名字

2,二维数组的初始化

与一维数组的初始化相似,二维数组的初始化分为:完全初始化,不完全初始化,和按照行初始化(即行可以省略列不能省略)。

//不完全初始化
int arr1[3][5] = {1,2}; 
int arr2[3][5] = {0};
//完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
//按照行初始化,不能省略列
int arr4[3][5] = {{1,2},{3,4},{5,6}};
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7}; 
int arr7[][5] = {{1,2}, {3,4}, {5,6}};

不同初始化对应的数组
在这里插入图片描述


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

arr3数组
在这里插入图片描述

int arr4[3][5] = {{1,2},{3,4},{5,6}};
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7}; 
int arr7[][5] = {{1,2}, {3,4}, {5,6}};

在这里插入图片描述

通过上面的事列我们就能很直观的看到数组元素与一维数组 一维数组与二维数组的关系了:

在这里插入图片描述

  • 二维数组本质上就是几个一维数组堆在一起变成了一个二维数组,这是二维数组里的元素就是一个一维数组,面对二维数组是要将其想象成一个坐标系,行为x轴列为y轴 横行数列嘛 ,一行就代表一个一维数组。比如上面的arr3数组还可以这样看arr[3]={arr[0],arr[1],arr[2]}; 而arr[0],arr[1],arr[2],则分别代表二维数组的第零个,第一个,第二个元素。

但是c语言中是不能这样写的,这里只是为了方便理解。

3,二维数组的输入输出

与一维数组一样,访问元素就要使用下标,同样二维数组也要产生相应的下标,只不过二维数组的下标是一个从零开始的坐标系。下面看一段代码:

#include <stdio.h> 
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"); 
	}
	return 0;
}

在这里插入图片描述

从运行结果上看与一维数组不同的地方在于,二维数组的输入与输出分别需要用到2次for循环,只有2次for循环才能产生x轴和y轴的坐标*。这里需要注意!(以上面的例子来举例),两个for循环不是同时进行的,而是外层循环循环一次内层循环就循环5次 先打印完一行再打印下一行,顺序是从左到右打印;每打完一行需要进行换行处理。例如:上面打印第一行的时侯紧接着产生5个列号,打印完这5个元素后才会进行下一行的打印。

那么为什么是一行一行打印而不是一列一列打印呢?那我们就来看看一维数组与二维数组在内存中的存在形式吧。

4,一维数组与二维数组在内存中的存储

依次打印一维数组元素的地址:

#include <stdio.h> 
int main() 
{ 
	int arr[10] = {1,2,3,4,5,6,7,8,9,10}; 
	int i = 0; 
	for(i=0; i<10; i++) 
	{ 
		printf("&arr[%d] = %p\n ", i, &arr[i]); 
		printf("\n");
	}
	return 0; 
}

在这里插入图片描述

  • 从输出的结果我们分析,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的 元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。这就 为后期我们使⽤指针访问数组奠定了基础

同样我们打印出二维数组的地址看看:

#include <stdio.h> 
int main() 
{ 
	int arr[3][5] = { 0 }; 
	int i = 0; 
	int j = 0; 
	for (i = 0; i < 3; i++) 
	{ 
		for (j = 0; j < 5; j++) 
		{ 
			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]); 
		}
	}
return 0;

在这里插入图片描述

  • 从输出的结果来看,每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元 素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以二维数组中的每个元素都是连续存放的。

好了以上就是数组的所有内容了,文章有点长感谢你能看到这里,感谢你们对我的支持!我将继续创作出更好的优质文章!同时有问题欢迎评论区指出。在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值