一维和二维数组

本文详细介绍了C语言中一维数组的语法、初始化、类型、下标操作以及内存存储方式,随后扩展至二维数组的概念、创建、下标、输入输出和内存结构,最后通过实例演示了字符移动和二分查找算法。
摘要由CSDN通过智能技术生成

风景

前言

哈喽呀,小伙伴们,水滴石穿非一日之功,冰冻三尺非一日之寒,学习本来就是一个循序渐进的过程。加油呀!少年!于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡。那就带着期待一起跟随小编进入今天的数组学习吧!


一、一维数组

1.一维数组的语法


 type  arr_name[常量值];
 

存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的⼤⼩数组的元素类型。
1.type指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以⾃定义的类型
2.arr_name 指的是数组名的名字,这个名字根据实际情况,起的有意义就⾏。
3.[ ] 中的常量值是⽤来指定数组的⼤⼩的,这个数组的⼤⼩是根据实际的需求指定就⾏。
⽐如:我们现在想储存20个人的年纪,那我们就可以创建⼀个数组,如下:


int age[20];

当然我们也可以根据需要创建其他类型和⼤⼩的数组:

char ch[8];
double score[10];
short strlen[20];	
float score[10];

2. 数组的初始化

当数组在创建的时候,我们需要给定⼀些初始值,这种就称为初始化的。那数组如何初始化呢?数组的初始化⼀般使⽤⼤括号,将数据放在⼤括号中。 列如:

//完全初始化
int arr[5] = {1,2,3,4,5};
//不完全初始化
int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0
//错误的初始化 - 初始化项太多
int arr3[3] = {1, 2, 3, 4};

在了解完数组初始化的这三种情况之后,接下来我们在看看数组的类型

3. 数组的类型

数组也是有类型的,它算一种自定义类型。那什么是数组类型呢?咋们先来看看下面这串代码:

int arr1[10];
int arr2[12];
char ch[5];

其实:
arr1数组的类型是 int [10]
arr2数组的类型是 int[12]
ch 数组的类型是 char [5]

4. 数组的下标

C语⾔规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下标就相当于数组元素的编号,如下:

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

在这里插入图片描述

数组的下标我们知道了,那如果我们要访问数组里的某一个值呢,哪有该咋办呢?这个时候呢就要用到"[ ]"操作符了,这个操作符叫做:下标引用操作符他的作用就是可以访问某个下标的值,比如arr[2],这个的意思就是访问下标是2的值,里上面的位列,输入的值就是”3“;

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

5. 数组的打印和输入

当学会了数组的下标可以打印以后个数组的 值时,那我们是不是可以结合循环结构可以把数组里的每个值都打印出来呢?那该怎么办呢?首先只要我们产⽣数组所有元素的下标就可以了,那我们使⽤for循环产⽣0~9的下标,接下来使⽤下标访问就⾏了。

在这里插入图片描述
当然,这里不光可以用for循环,还可以用while ,do while循环 ,现在有了数组的输出,那是不是也可以输入呢?其实数组的输入是存在的,那下面我们一起来看看把。先看看这串代码:

#define _CRT_SECURE_NO_WARNINGS
#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++)
	{
		scanf("%d", &arr[i]);
	}
 return 0;
 }

这是打印输入的值

在这里插入图片描述

6. ⼀维数组在内存中的存储

有了前⾯的知识,我们其实使⽤数组基本没有什么障碍了,如果我们要深⼊了解数组,我们最好能了解⼀下数组在内存中的存储。
依次打印数组元素的地址

#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]);
 }
 return 0;
}

在这里插入图片描述
从输出的结果我们分析,数组随着下标的增⻓,地址是由⼩到⼤变化的,并且我们发现每两个相邻的元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。这就为后期我们使⽤指针访问数组奠定了基础(在讲指针的时候我们在讲,这⾥暂且记住就⾏)

二、二维数组

1. ⼆维数组的概念

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

2. ⼆维数组的创建

二维数组是怎么定义的呢?语法如下:

type arr_name[常量值1][常量值2];
例如:
int arr[6][6];
double data[8][8];
float arr[3][4];

1.常量值1是代表行;
2.常量值2是代表列;
3.int表示数组的每个元素的整形类型;
4.arr是数组名,可以 根据你自己的需求的来定义;

3. ⼆维数组的初始化

其实二维数组的创建跟一维数组的创建大同小异,只是二维数组要比一维数组要复杂一点点那我们现在来看看二维数组的几种初始化把!
1.不完全初始化

int arr1[3][5] = {1,2};
int arr2[3][5] = {0};

这是他的图形:
在这里插入图片描述
2 . 完全初始化

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

这是他的图形:
在这里插入图片描述

3.按照行初始化

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

这是它的图形:
在这里插入图片描述
4. 初始化时省略⾏,但是不能省略列

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}};

这是他的图形:
在这里插入图片描述

4.二维数组的下标

小伙伴们,咋们了解到了一维数组的下标,那你知道二维数组的下标吗?其实呀⼆维数组访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定数组中的⼀个元素。

C语⾔规定,⼆维数组的⾏是从0开始的,列也是从0开始的
如果咋们想找到二维数组中的某个值,那么咋们就可以建一个坐标系去找每一个元素:
在这里插入图片描述
咋们一这幅图位列,如果我想找到第二行中的4和第三行的6我们就可以这样写:

#include <stdio.h>
int main()
{
 int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
 printf("%d\n", arr[1][2]);//4
 printf ("%d\n",arr[2][3];//6
 
 return 0;
 }

6.⼆维数组的输⼊和输出

访问⼆维数组的单个元素我们知道了,那如何访问整个⼆维数组呢?其实我们只要能够按照⼀定的规律产⽣所有的⾏和列的数字就⾏;以上⼀段代码中的arr数组为例,⾏的选择范围是0~~2,列的取值范围是0~4,所以我们可以借助循环实现⽣成所有的下标。

#include <stdio.h>
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++) //产⽣列号
 {
 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;
}

三, 数组练习

1. 练习1:多个字符从两端移动,向中间汇聚

编写代码,演⽰多个字符从两端移动,向中间汇聚

#include <stdio.h>
int main()
{
 char arr1[] = "welcome to bit...";
 char arr2[] = "#################";
 int left = 0;
 int right = strlen(arr1)-1;
 printf("%s\n", arr2);
 while(left<=right)
 {
 Sleep(1000);//放慢速度的函数
 arr2[left] = arr1[left];
 arr2[right] = arr1[right];
 left++;
 right--;
 printf("%s\n", arr2);
 }
 retutn 0;
}

练习 2.二分查找

在⼀个升序的数组中查找指定的数字n,很容易想到的⽅法就是遍历数组,但是这种⽅法效率⽐较低。⽐如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?你会1,2,3,4…这样猜吗?显然很慢;⼀般你都会猜中间数字,⽐如:150,然后看⼤了还是⼩了,这就是⼆分查找,也叫折半查找

#include <stdio.h>
int main()
{
 int arr[] = {1,2,3,4,5,6,7,8,9,10};
 int left = 0;
 int right = sizeof(arr)/sizeof(arr[0])-1;
 int key = 7;//要找的数字
 int mid = 0;//记录中间元素的下标
 int find = 0;
 while(left<=right)
 {
 mid = (left+right)/2;
 if(arr[mid]>key)
 {
 right = mid-1;
 }
 else if(arr[mid] < key)
 {
 left = mid+1;
 }
 else
 {
 find = 1;
 break;
 }
 }
 if(1 == find )
 printf("找到了,下标是%d\n", mid);
 else
 printf("找不到\n");
}
retrun 0;
}

求中间元素的下标,使⽤ mid = (left+right)/2 ,如果left和right⽐较⼤的时候可能存在问题,可以使⽤下⾯的⽅式:

1 mid = left+(right-left)/2;

总结

昨天再好,也走不回去,明天再难,也要抬脚继续。请你相信你今天的日积月累,早晚会让你成为别人的望尘莫及。希望小伙伴们能够学有所成,朝着梦想的方向前进吧!加油!每个追梦的少年!

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值