首页 > 其他分享 >【C语言】--关于数组的一系列问题,看这篇就够了

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

时间:2024-12-07 17:58:53浏览次数:5  
标签:初始化 arr -- ++ 这篇 C语言 int 二维 数组

前言:

在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 语言程序,解决各种复杂的编程问题。通过不断的实践和深入学习,能够更好地发挥数组在数据处理和算法实现中的强大作用。看到这里别忘了给个三连,支持一下博主哦!

标签:初始化,arr,--,++,这篇,C语言,int,二维,数组
From: https://blog.csdn.net/user340/article/details/144299717

相关文章

  • 【学习笔记】(四)Mybatis整合SpringBoot后的启动与执行流程
    导语上一章介绍了bean的创建与加载流程,本章将粗粒度地介绍Mybatis整合SpringBoot后的启动与执行流程。也算是对上一章内容的补充。因为上一章更多的是介绍一般情况下的bean创建与加载流程。本章会介绍通过@Bean注解或FactoryBean实现类进行bean创建的流程上一章的传送门:Sp......
  • Bladex集成screw数据库设计文档(图文说明)
    目录前言1.前端2.后端3.配置4.彩蛋前言对于Java的基本知识推荐阅读:java框架零基础从入门到精通的学习路线附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新)screw的基本知识推荐阅读:数据库设计文档Screw的基本知识附Demo原先bladex集......
  • 程控直流电源与电子负载
    目录:1、概述2、资料的下载3、电源的操作4、硬件的连接5、软件的控制6、相关指令1)直流电源指令  2)电子负载指令  3)直流电源LIST指令  4)电子负载Trace指令附录1、概述程控对象:艾德克斯IT6522A电源与IT8812电子负载。图1.1IT6522A电源图1.2 IT8812电子......
  • 《Java核心技术I》死锁
    死锁账户1:200元账户2:300元线程1:从账号1转300到账户2线程2:从账户2转400到账户1如上,线程1和线程2显然都被阻塞,两个账户的余额都不足以转账,两个线程都无法执行下去。有可能会因为每一个线程要等待更多的钱款存入而导致所有线程都被阻塞,这样的状态称为死锁(deadlock)。通俗的......
  • Metasploit使用
    最近在学Metasploit,Metasploit是一个免费的、可下载的渗透测试框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击,是一个集成了渗透测试全流程的渗透工具。图一模块:模块组织按照不同的用途分为7种类型的模块(Modules):分为辅助模块(Auxiliary)、渗透攻击模块(Exploit......
  • QTTabBar | 实现“此电脑”在命令栏直接点击 以及点击 新标签页加号(+)的时候默认导航到
     1、如何实现点击上面命令栏目“此电脑”,并且在当前视图打开。  按照下面设置关键命令是:shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}代表导航到【此电脑】  2、点击新标签页加号(+)的时候默认导航到“此电脑”视图,并且是当前视图(当前窗口不是新窗口)  ......
  • 修改路由表,让设备可以同时使用两个网络
    进入WindowsPowerShell(以管理员身份运行),routeprint打印路由表, 网络目标 子网掩码 默认网关 端口 跃点数0.0.0.00.0.0.0192.168.1.1192.168.1.7250.0.0.00.0.0.010.177.202.1192.168.1.......
  • 类模板与继承
    当模板碰到继承时,需要注意以下几点:当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中T的类型如果不指定,编译器无法给子类分配内存如果想灵活指定出父类中T的类型,子类也需变为模板示例:#include<iostream>usingnamespacestd;#include<string>//类模板与继......
  • 205. 同构字符串
      给定两个字符串 s 和 t ,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符......
  • 第72篇 跨域的简单介绍
    1.跨域的相关概念1.1什么是跨域同源策略是由Netscape提出的著名安全策略,是浏览器最核心、基本的安全功能,它限制了一个源(origin)中加载文本或者脚本与来自其他源(origin)中资源的交互方式,所谓的同源就是指协议、域名、端口相同。当浏览器执行一个脚本时会检查是否同源,只有同源的......