第六讲:数组

1.什么是数组

数组是一组相同元素的集合

数组中必须要有元素,元素个数不能为0
一个数组中存放的多个数据,类型是相同的

2.一维数组

2.1数组的创建

1   type arr_name[常量值];
    //type是指数组元素的类型
    //arr_name是指数组的名字,由自己起,有意义就行
    //[]中的常量是用来指定数组的大小的

注意:
[ ]中的值必须是常量,不能是变量

2.2数组的类型

1  int  arr [10]
2  int  arr2[5]
3  char ch  [4]

数组除去数组的名称就是这个数组的类型
arr 的数据类型是 int [10]
arr2的数据类型是 int [5]
char的数据类型是 char [4]

2.3一维数组在内存中的存储

在这里插入图片描述
对于上面的代码,运行结果为:
在这里插入图片描述
可知:随着下标的增长,地址是从小到大变化的,并且每两个相邻元素地址的差值为4(因为一个整形是4个字节)
由此:数组在内存中是连续存放的

2.4sizeof计算数组元素个数

对于sizeof函数的详解,参考:

链接: sizeof函数详解

3.二维数组

3.1概念

一维数组是数组元素的集合
二维数组是一维数组的集合

具体如下:
在这里插入图片描述

3.2二维数组的创建

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

3.3二维数组的初始化

3.3.1直接初始化

在这里插入图片描述
这种初始化是对数组进行了直接的初始化,从第【0】【0】个元素开始
在这里插入图片描述

3.3.2按行初始化

二维数组也可以按照行进行初始化:
在这里插入图片描述
当我们这样进行初始化时,就实现了按行初始化,结果如下:
在这里插入图片描述

3.3.3注意事项

需要注意的是,二维数组在初始化时可以省略行数,但是不能省略列数:

 int arr5[][5] = {1,2,3};

3.4二维数组的下标

在这里插入图片描述

3.5二维数组在内存中的存储

二维数组在内存中也是连续存放

4.C99中的变长数组

在C99标准中给出了一个变长数组,允许我们可以使用常量来指定数组大小

#include <stdio.h>
int main()
{
	int n = 0;
 	scanf("%d", &n);//根据输⼊数值确定数组的⼤⼩
	int arr[n];
 	int i = 0;
 	for (i = 0; i < n; i++)
 	{
 		scanf("%d", &arr[i]);
 	}
 	for (i = 0; i < n; i++)
 	{
 		printf("%d ", arr[i]);
 	}
 	return 0;
}

此时,我们就可以这样来输入变量的大小

注意:
变长数组不允许初始化数组

5.练习

5.1练习1

多个字符从两端移动,向中间汇聚
在这里插入图片描述

5.2⼆分查找(折半查找)

5.2.1要求

升序的数组(必须是升序的数组)中查找指定的数字n,使用二分查找。

⽐如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?你会1,2,3,4…这样猜吗?显然很慢;⼀般你都会猜中间数字,⽐如:150,然后看⼤了还是⼩了

这就是⼆分查找,也叫折半查找。

5.2.2代码实现

在这里插入图片描述

6.所有代码展示

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//一维数组在内存中的存储
int main()
{
	int arr[4] = { 1, 2, 3, 4 };
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		printf("%p\n", &arr[i]);
	}
	return 0;
}

//二维数组的初始化
int main()
{
	//不完全初始化
	int arr[4][4] = { 1, 2, 3, 4, 5, 6 };
	//完全初始化
	int arr1[4][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8};
	return 0;
}

//按行初始化
int main()
{
	//按行初始化
	int arr[3][4] = { {1, 2}, {3, 4}, {5, 6} };
	return 0;
}

//多个字符从两端移动,向中间汇聚
#include <windows.h>
int main()
{
	char arr[] = "hello world!";
	char arr1[] = "************";
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 2;
	printf("%s", arr1);
	while (left <= right)
	{
		Sleep(1000);
		system("cls");
		arr1[left] = arr[left];
		arr1[right] = arr[right];
		printf("%s", arr1);
		left++;
		right--;
	}
	return 0;
}

//二分查找
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int search = 0;
	printf("请输入您需要查找的数字:");
	scanf("%d", &search);
	while(left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] > search)
		{
			right = mid - 1;
		}
		else if (arr[mid] < search)
		{
			left = left + 1;
		}
		else if (arr[mid] == search)
		{
			printf("所查找的数字的下标为:%d", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("没找到!");
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值