首页 > 其他分享 >数组(一维数组、二维数组、变长数组)

数组(一维数组、二维数组、变长数组)

时间:2025-01-05 23:28:54浏览次数:3  
标签:初始化 arr 数组 10 int 元素 二维 一维

1.数组的概念

数组是⼀组相同类型元素的集合
• 数组中存放的是1个或者多个数据,但是数组元素个数不能为0
• 数组中存放的多个数据,类型是相同的
•数组分为⼀维数组和多维数组

2.一维数组的创建和初始化

(1)数组创建

语法:

1 type name[常量值]

type 指定的是数组中存放数据的类型,可以是: char short int float 等,也可以⾃定义的类型
name 指的是数组名的名字, 名字可以自拟定,有意义的就行
[] 中的常量值是⽤来指定数组的⼤⼩的,数组大小根据需求指定即可

[]中的常量值可以不写,编译器会根据初始化所给的元素的个数确定数组的元素个数

1 int arr[] = {1,2,3};//arr数组的个数就有3个

例子:存储班级的20⼈的成绩

1 int grade[20];

(2)数组的初始化

•创建数组时,给定⼀些初始值,这就称为初始化
•数组的初始化⼀般使⽤⼤括号,将数据放在⼤括号中

完全初始化 ( 数组有多少个元素,给定多少个初始值 )

1 int arr[5] = {1,2,3,4,5}; // 数组有5个元素,给定5个初始值

不完全初始化 ( 没有给定数组相应元素个数的初始值 )

1 int arr1[5] = {1};//第一个元素初始化为1,剩余的元素默认为0
2 double arr2[5] = {1.1,2.4};//同理,第一个元素初始化为1。1,第二个元素初始化为2.3,剩余的元素默认为0

错误初始化 ( 初始化项多于数组元素个数)

1 int arr[2] = {1,2,3};

(3)数组的类型

去掉数组名留下的就是数组的类型

例如:

1 int arr1[10]; // arr1 的数组的类型是 int [10]
2 double arr2[3]; // arr2 的数组的类型是 double [3]
3 char arr3[5]; // arr3 的数组的类型是 char [5]

运用sizeof区别,sizeof可以计算内置的类型数组⾃定义类型的⼤⼩
siezof (type) type可以是数据的类型或者数值名
(具体可看https://blog.csdn.net/Siri_s12/article/details/143997006?spm=1001.2014.3001.5501

sizeof(arr) = sizeof(int [5])这也侧面反映出去掉数组名留下的就是数组的类型这句话
在这里插入图片描述

3.一维数组

(1)数组下标

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

例如:

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

在这里插入图片描述
•在C语⾔中数组的访问提供了⼀个操作符[] ,这个操作符叫:下标引⽤操作符,如果想要访问下标为3的元素,可以表述成arr[3]arr[3] 代表的数是4
在这里插入图片描述

(2)数组元素的打印

•使⽤for循环

整形数组浮点型数组没办法一次性输出,必须使用循环

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

在这里插入图片描述

字符数组的输出可以使用循环,也可以一次性输出
在这里插入图片描述
这里用字符串形式输出
在这里插入图片描述

(3)数组的输入

•使⽤for循环

整形数组浮点型数组的操作是逐个元素去处理的,没u一次输入,也没办法一次性输出,必须使用循环

#include <stdio.h>
int main()
{
	int arr[8] = { 1,2,3,4,5,6,7,8 };
	int i = 0;

	//数组的输入
	for ( i = 0; i < 8; i++)
	{
		scanf("%d", &arr[i]);//arr[i]代表的是数组的元素,所以要取地址&,数组名才不用取地址
	}

	//数组的输出
	for ( i = 0; i < 8; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

在这里插入图片描述

4.一维数组在内存中的存储

数组在内存中是连续存放的

在这里插入图片描述

x64 ---- 编译产生的是64位的程序,地址是64位的,比较长在这里插入图片描述

x86 ---- 编译产生的是32位的程序,地址是32位的,比较短
在这里插入图片描述

•地址是16进制打印(1-9,A-F)
A=10 B=11 C=12 D=13 E=14 F=15
在这里插入图片描述

运用x86的地址数据观察:
•从输出的结果我们分析,数组随着下标的增⻓,地址是由⼩到⼤变化的,并且我们发现每两个相邻的元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的

•从下标也可以看出,地址是由⼩到⼤变化的
在这里插入图片描述

5.sizeof 计算数组元素个数

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%zd\n", sizeof(arr));
	//计算的是数组的总长度,单位是字节,10*4=40
	
	return 0;
}

在这里插入图片描述
数组中所有元素的类型都是相同的,只要计算出⼀个元素所占字节的个数,数组的元素个数就能算出来

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%zd\n", sizeof(arr));
	//计算的是数组的总长度,单位是字节,10*4=40
	
	printf("%zd\n", sizeof(arr[0]));
	//计算的是数组下标为0的元素的长度,单位是字节,4

	return 0;
}

在这里插入图片描述
接下来就能计算出数组的元素个数:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
    printf("%zd\n",sizeof(arr)/sizeof(arr[0]));//结果是10,表示数组有10个元素

	return 0;
}

在这里插入图片描述

在代码中需要数组元素个数的地⽅就可以不⽤固定写死,可以使用 sizeof() 计算数组的长度,不管数组怎么变化,计算出的⼤⼩也就随着变化了

6.二维数组

(1)二维数组的概念

•把⼀维数组做为数组的元素,就是⼆维数组
•以此类推,把二维数组作为数组的元素就是三维数组
•⼆维数组以上的数组统称为多维数组

(2)二维数组的创建

语法:

1 type name[常量值1][常量值2];

type 表示数组的类型
name 表示数组的名字,不固定,取有意义的即可
常量值1表示数组的行数
常量值2表示每行有多少个元素

例子:

1 int arr[3][4];
// int 表⽰数组的每个元素是整型类型
// arr 是数组名,可以根据⾃⼰的需要指定名字
// 3表⽰数组有3⾏ 
// 5表⽰每⼀⾏有5个元素 

7.二维数组的初始化

•在创建变量或者数组的时候,给定⼀些初始值,被称为初始化
•⼆维数组的初始化与⼀维数组⼀样,也是使⽤⼤括号初始化

不完全初始化(未给定值的项为0)

1 int arr[2][4] = {1,3,4};
2 //   1 2 3 0
3 //   0 0 0 0

完全初始化

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

按照行初始化

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

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

1 int arr[][3] = {1};
2 //  1 0 0
1 int arr[][3] = {1,2,3,4};
2 //  1 2 3
3 //  4 0 0
1 int arr[][3] = {{1},{2},{3}};
2 //  1 0 0
3 //  2 0 0
4 //  3 0 0

8.二维数组的使用

(1)二维数组的下标

•⼆维数组访问与一维数组访问一样,也是使⽤下标的形式,⼆维数组有⾏和列,只要锁定了⾏和列就能唯⼀锁定数组中的⼀个元素
⼆维数组的⾏是从0开始的,列也是从0开始的

比如:

1 int arr[3][5] = {1,2,3,4,5, 6,7,8,9,10, 11,12,13,14,15};

在这里插入图片描述
图中最右侧绿⾊的数字表⽰⾏号,第⼀⾏蓝⾊的数字表⽰列号,都是从0开始,比如要找到7可以这么写arr[1][1]
在这里插入图片描述

(2)二维数组的输入和输出

借助循环实现⽣成所有元素的下标

#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("%2d ", arr[i][j]);//输出数据
		}
		printf("\n");//分行
	}
	return 0;
}

在这里插入图片描述

9.二维数组在内存中的存储

方法:打印出数组所有元素的地址

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

在这里插入图片描述
从输出的结果来看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元素之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放

10.C99中的变长数组

•C99中给⼀个变⻓数组(variable-length array,简称VLA)的新特性,允许我们可以使⽤变量指定数组⼤⼩

•变⻓数组的根本特征,就是数组⻓度只有运⾏时才能确定,所以变⻓数组不能初始化

•VS2022上默认的编译器是MSVC,MSVC编译器是不支持C99中的变长数组的,要改写成clang编译器才可以运行(VS2022如何将编译器更改为clang编译器https://blog.csdn.net/Siri_s12/article/details/144242165?spm=1001.2014.3001.5501

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

输入6正常输出
在这里插入图片描述

输入10正常输出
在这里插入图片描述

标签:初始化,arr,数组,10,int,元素,二维,一维
From: https://blog.csdn.net/Siri_s12/article/details/144805927

相关文章

  • 【c# WPF贪吃蛇教程】Grid与UniformGrid一对异姓兄弟在二维世界玩蛇之幻觉让我骑大蛇
    前言    经过前面两次的贪吃蛇项目,我已经完全掌握了突破二维次元的绝对力量,一定要把小蓝(一只老鼠)从次壁中解救出来,键盘磨出的斑驳深痕被老祖的天门法眼洞悉,赐予我两枚绝域神器,分别是Grid和UniformGrid,奈何不好驾驭,但也阻挡不了我战胜蛇蛇的决心。。。    项......
  • 学习随想:高维AI数据的训练和推理与一维数据的排序和查找
    以下是看AttentionIsAllYouNeed这篇文章的一点随想。说实话,我没看懂transformer是咋回事,但突然一个类比念头,让我感觉有点概念了,虽然所有的类比都是不完备的。学习随想记录如下,仅供查考:物理世界高维AI数据一维数据物理对象n维矩阵向量,Word2vec一维数组观察与实验数据......
  • C语言指针数组在字符串的实例
    还记得指针数组吗?(一堆指针组成的数组)我们当时推荐字符串用这一块的内容,因为一句话可以用指针代替然后用指针数组组合在一起成为一个语句组成的的矩阵(总之就是攒在一起了方便操作),这一节也建议回顾一下字符串这一块,和string函数库基本格式与录入输出我们首先要创建一个指针数......
  • 一维差分
    假设现在对如下数组进行差分求解:123456 假设要对区间位置2到3的位置进行统一的加2操作, 再对位置3到5进行统一的减6操作1#include<iostream>2usingnamespacestd;34intmain(){5intn,m,num[10],diff[10];6cin>>n>>m;//输入的n表示数......
  • 第15章 汇编语言--- 数组与指针
    汇编语言是一种低级编程语言,它几乎与特定的计算机架构一一对应。在汇编语言中,数组和指针的概念不像在高级语言(如C或C++)中那样直接存在,但可以通过对内存地址的操作来实现类似的功能。在汇编语言中,数组可以被看作是一系列连续存储的相同类型的元素,而指针则是用来存放某个变量......
  • C++中的 多维数组、锯齿数组
    多维数组定义:多维数组可以看作是数组的数组,通过在定义时指定每个维度的大小来创建。下面以三维数组为例。访问:使用多个索引来访问数组中的元素,索引从0开始。销毁:对于栈上定义的多维数组,当作用域结束时会自动销毁;对于堆上动态分配的多维数组,需要手动释放内存。#include<iost......
  • 【C语言】数组——二分查找
    题1704.二分查找【简单】intsearch(int*nums,intnumsSize,inttarget){intleft=0,right=numsSize-1;intmid=(left+right)/2;intresult=-1;while(left<=right){if(nums[mid]==target){r......
  • 2025-01-04:不包含相邻元素的子序列的最大和。用go语言,给定一个整数数组 nums 和一个由
    2025-01-04:不包含相邻元素的子序列的最大和。用go语言,给定一个整数数组nums和一个由二维数组queries组成的查询列表,其中每个查询的格式为queries[i]=[posi,xi]。对于每个查询i,首先将nums[posi]的值更新为xi,然后计算在这一更新后,数组nums中所有不包含相邻元素的子序......
  • BUGAWAY算法小抄-差分数组
    BUGAWAY算法小抄-差分数组什么是差分数组?差分数组的思想是通过对原始数组进行处理,得到一个新的数组(差分数组),利用该数组来高效地进行区间更新操作。具体来说,差分数组记录的是相邻元素之间的差值,而不是原始数组的元素本身。差分数组的原理1.差分数组的构造:假设有一个数组A=......
  • 特殊数据类型的深度分析:JSON、数组和 HSTORE 的实用价值
    title:特殊数据类型的深度分析:JSON、数组和HSTORE的实用价值date:2025/1/4updated:2025/1/4author:cmdragonexcerpt:随着数据管理需求的多样化,许多现代数据库系统开始支持特殊数据类型,以满足更多复杂应用场景的需求。在PostgreSQL中,JSON、数组和HSTORE类型为开......