【C语言】--关于数组的一系列问题,看这篇就够了

前言:

在C语言中,数组是一种极为重要的数据结构,它为储存和处理多个相同类型的数据元素提供了便携而高效的方式。无论是处理简单的数值序列还是复杂的数据集合,数组都扮演着不可或缺的角色。下面,就跟博主一起来看看数组的一系列问题吧!

1.数组是什么?

数组是由相同类型的元素组成的有序集合,这些元素在内存中连续储存。可以将数组想象成一排盒子,一个盒子中存放一个元素,每个盒子下面都有一个标号,不过是从0开始,这些标号称为下标。
注:

1.数组中存放的元素不能为0;
2.数组中存放的元素类型是相同的
3.数组分为一维数组和多维数组,多维数组常见的一般为二维数组

2.一维数组

2.1 一维数组的创建和初始化

(1)数组的创建

语法如下:

type arr_name[常量];

1.type 指的是数组元素的类型,eg: int , float , char , short…
2.arr_name 指数组的名字
3.[ ]中放的是一个常量值,表达数组的大小

实例如下:

#include<stdio.h>
int main()
{
	int  arr1[5];
	float arr2[10];
	char  arr3[10];
	double arr4[10];
	return 0;
}
(2)数组的初始化

数组在创建时,我们需要给定初始值,称为初始化
在这里插入图片描述

数组的类型:去掉数组名,剩下的就是数组的类型

2.2 一维数组的使用

(1)数组的下标

博主在刚开始就提到了数组的下标,在这里用图片表达,方便大家理解
在这里插入图片描述
[ ] : 下标引用符 ,访问下标为6的元素,如图:
在这里插入图片描述
在这里插入图片描述

(2)数组的输入和打印
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

执行结果:
在这里插入图片描述

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

打印数组元素的地址:

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

2.二维数组

只要将一维数组作为一堆数组的元素,就得到了二维数组,同理:将二维数组作为数组元素时,就得到了三维数组

2.1 二维数组的创建和初始化

(1)二维数组的创建

语法如下:

type arr_name[常量1][常量2];
eg:int arr[3][5];
//3:表示3行
//5:表示一行有5个元素
(2)二维数组的初始化
int main()
{
	int arr1[3][5] = { 1,2, };//不完全初始化
	int arr2[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };//完全初始化
    int  arr3[3][5] = {{1,2},{3,4},{5,6}};
	return 0;
}

在这里插入图片描述
在这里插入图片描述

初始化时可以省略行,但不能省略列

int arr[][5]

2.2 二维数组的使用

二维数组的使用也是通过下标,用双重循环进行嵌套

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

在这里插入图片描述

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

和一维数组一样,打印出二维数组的每个元素的地址

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++)
		{
			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
		}
	}
	return 0;
}

在这里插入图片描述

同样,地址之间相差4个字节,并且每个元素连续存放

3.变长数组

语法如下:

int n = a+b;
int arr[n]

arr 为变长数组,它的长度由n决定,只有运行时才知道n是多少,即:数组的长度也只有运行时才能知道,所以变长数组不能初始化,变长数组不是说数组的大小可以改变,而是数组的大小可以根据变量来指定。(但是变长数组在vs2022无法使用,可以在gcc编译器上使用)

或者是在vs2022中安装clang编译组件
在这里插入图片描述
给n 中输入10,然后在输入十个数字,并输出:

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

在这里插入图片描述

4.练习

(1)多个字符从两端移动,向中间汇聚
int main()
{
	char arr1[] = "welcome to bit...";
	char arr2[] = "*****************";
	int left = 0;
	int right = strlen(arr1) - 1;
	while (left <= right)
	{
		
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);
		system("cls");
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

在这里插入图片描述

(2)二分查找
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 n = 7;//要找的数字
	int mid = 0;
	int find = 0;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > n)
		{
			right = mid - 1;
		}
		else if (arr[mid] < n)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标是%d\n", mid);
			find = 1;
			break;
		}
	}
	if (find == 0)
	{
		printf("找不到了\n");
	}
	return 0;

}

在这里插入图片描述

总结:

C 语言数组是编程中的重要工具,熟练掌握数组的概念、声明、初始化、访问、遍历以及应用场景和注意事项,能够帮助我们更加高效地编写 C 语言程序,解决各种复杂的编程问题。通过不断的实践和深入学习,能够更好地发挥数组在数据处理和算法实现中的强大作用。看到这里别忘了给个三连,支持一下博主哦!

评论 71
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值